Python 二叉树有序遍历

Python 二叉树有序遍历,python,algorithm,Python,Algorithm,我写了这样一个解决方案 但并没有如预期的那样起作用 Finished Runtime: 48 ms Your input [1,null,2,3] Output [1] Expected [1,3,2] 我的解决方案有什么问题?当您使用tree编写代码时,解决方案经常使用递归。在您的情况下,您搜索的代码可能是: def inorderTraversal(根目录): 结果=[] 如果root.left!=无: 扩展结果(inorderTraversal(root.left)) result

我写了这样一个解决方案

但并没有如预期的那样起作用

Finished
Runtime: 48 ms
Your input  [1,null,2,3]
Output  [1]
Expected  [1,3,2]

我的解决方案有什么问题?

当您使用tree编写代码时,解决方案经常使用递归。在您的情况下,您搜索的代码可能是:

def inorderTraversal(根目录):
结果=[]
如果root.left!=无:
扩展结果(inorderTraversal(root.left))
result.append(root.val)
如果root.right!=无:
扩展结果(inorderTraversal(root.right))
返回结果

如果不清楚,请询问我,我将增加更高的精度

当您使用tree编写代码时,解决方案通常是使用递归,在您的情况下,您搜索的代码将是:

def inorderTraversal(根目录):
结果=[]
如果root.left!=无:
扩展结果(inorderTraversal(root.left))
result.append(root.val)
如果root.right!=无:
扩展结果(inorderTraversal(root.right))
返回结果

如果不清楚,请询问我,我将增加精度

您的解决方案存在以下问题:

  • 如果没有左图,则打印节点并从子树返回,而不向右
  • 如果你有一个左键,你可以附加它。这可能会导致无限循环(当您从左侧返回时,将再次附加它)
要修复您的解决方案,请执行以下操作:

  • 如果没有左边的节点,请打印节点,然后将右边的节点放在堆栈上
  • 如果您有一个left,请将left放在堆栈上,并从TreeNode中删除left指针,这样在返回时就不会再添加它了
另一种方法是,如果你不能摧毁树:

  • 一直向左走,将沿途的所有节点放在堆栈上
  • 从堆栈中删除节点时,请打印它,向右移动,然后一直向左移动,将所有节点放在堆栈上
类解决方案:

def inorderTraversal(self, root: "TreeNode") -> "List[int]":
    stack, res = [root], []
    cur = stack[-1]
    while cur.left != None:
        stack.append(cur.left)
        cur = cur.left 
    while stack:
        cur = stack.pop()
        res.append(cur.val)
        if cur.right != None:
            stack.append(cur.right)
            cur = cur.right
            while cur.left != None:
                stack.append(cur.left)
                cur = cur.left 
    return res 

您的解决方案存在以下问题:

  • 如果没有左图,则打印节点并从子树返回,而不向右
  • 如果你有一个左键,你可以附加它。这可能会导致无限循环(当您从左侧返回时,将再次附加它)
要修复您的解决方案,请执行以下操作:

  • 如果没有左边的节点,请打印节点,然后将右边的节点放在堆栈上
  • 如果您有一个left,请将left放在堆栈上,并从TreeNode中删除left指针,这样在返回时就不会再添加它了
另一种方法是,如果你不能摧毁树:

  • 一直向左走,将沿途的所有节点放在堆栈上
  • 从堆栈中删除节点时,请打印它,向右移动,然后一直向左移动,将所有节点放在堆栈上
类解决方案:

def inorderTraversal(self, root: "TreeNode") -> "List[int]":
    stack, res = [root], []
    cur = stack[-1]
    while cur.left != None:
        stack.append(cur.left)
        cur = cur.left 
    while stack:
        cur = stack.pop()
        res.append(cur.val)
        if cur.right != None:
            stack.append(cur.right)
            cur = cur.right
            while cur.left != None:
                stack.append(cur.left)
                cur = cur.left 
    return res 

一个在这里,如果你把它和你的比较,你试过调试吗?您的发现是什么?这里有一个,如果您将其与您的进行比较,您是否尝试过调试?你的发现是什么?