LeetCode-二叉树中序遍历——D9【一般难度】

题目描述

Given a binary tree, return the inorder traversal of its nodes’ values.

Example:

Input: [1,null,2,3]
1

2
/
3

Output: [1,3,2]
Follow up: Recursive solution is trivial, could you do it iteratively?

算法思路

1.先入栈根节点左侧边界节点
2.从栈中拿出节点node,保存它的值,在查看node是否存在右侧节点,
如果有右侧节点,则再继续入栈右侧节点,以及入栈它的左侧边界节点
如果没有右侧节点,则继续从栈中拿出节点

在下面二叉树中,1的左侧边界节点为2和4,并不包含8.

       1
      /  \
     2     3
    / \    /\
   4  8    5  6
              \
               7

算法实现

class TreeNode():
    def __init__(self,x):
        self.val=x
        self.left=None
        self.right=None
        
class Solution:
    def inorderTraversal(self,root):
        res=[]
        stack=[root]
        
        left=root.left
        #左节点全部先入栈——根节点最左侧节点(最左边界处的节点)
        while left!=None:
            stack.append(left)
            left=left.left
            
        #从栈中拿出节点
        #1.拿出来的节点查看还有没有右侧节点
        #2.有右侧节点的,先把他的左侧边界节点入栈
        while stack:
            node=stack.pop()
            res.append(node.val)
            
            t=node.right
            while t:
                stack.append(t)
                t=t.left
            
        return res
    

test=Solution()
n1=TreeNode(1)
n2=TreeNode(2)
n3=TreeNode(3)
n4=TreeNode(4)
n5=TreeNode(5)
n6=TreeNode(6)
n7=TreeNode(7)
n1.left=n2
n1.right=n3
n2.left=n4
n3.left=n5
n3.right=n6
n6.right=n7
"""
       1
      / \
     2   3
    /    /\
   4    5  6
            \
             7
"""
print(test.inorderTraversal(n1))
#[4, 2, 1, 5, 3, 6, 7]

小结

二叉树的中序迭代遍历比前序遍历考虑的要多一点,因为栈中要先存储所有左侧边界节点,然后在从栈中取出节点node并保存值,接下来要继续查看次节点是否存在右侧节点node*,若存在,还是得先将node*的左侧边界节点入栈。

发布了205 篇原创文章 · 获赞 655 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/qq_33414271/article/details/97975573