二叉树有序遍历

时间:2019-07-05 08:24:38

标签: python algorithm

我为Binary Tree Inorder Traversal - LeetCode

写了这样的解决方案
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: "TreeNode") -> "List[int]":
        stack, res = [root], []

        while stack:
            cur = stack[-1]
            cur = cur.left

            if cur == None:
                cur = stack.pop()
                res.append(cur.val)
                cur = cur.right 
            else:
                stack.append(cur)
                cur = cur.left 
        return res 

但未按预期工作

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

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

2 个答案:

答案 0 :(得分:2)

您的解决方案存在的问题是:

  • 如果没有左边,则打印节点并从子树中返回而无需右​​边
  • 如果有左边,请附加它。可能导致无限循环(当您从左侧返回时,会再次添加它)

要解决您的解决方案,请执行以下操作:

  • 如果没有左边,请打印节点并将右边的元素放在堆栈上
  • 如果有左边,请将左边放在堆栈上,然后从TreeNode中删除左边的指针,这样就不会在返回时再次添加它。

另一种方法,如果您无法破坏树:

  • 一直走到最左边,将所有节点都放在堆栈上
  • 从堆栈中删除节点时,先打印它,然后向右走,然后一直到最左边,将所有节点都放在堆栈中。

类解决方案:

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 

答案 1 :(得分:0)

当您使用tree编写代码时,解决方案非常倾向于在您要搜索的代码为的情况下使用递归:

def inorderTraversal(root):
    result = []
    if root.left != None:
        result.extend(inorderTraversal(root.left))
    result.append(root.val)
    if root.right != None:
        result.extend(inorderTraversal(root.right))
    return result

如果不清楚,请问我,我会提高精度