栈模拟遍历二叉树前、中、后序

栈模拟遍历二叉树前、中、后序

颜色标记法

下面为中序遍历,改变入栈顺序可改变遍历顺序

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        stack = [root]
        while stack:
            node = stack.pop()
            if not node: continue
            if isinstance(node, TreeNode):
                stack.extend([node.right, node.val, node.left])
            else:
                res.append(node)
        return res

先序遍历

    def preorderTraversal(self, node, k):
        # write code here
        stack = []
        res = []
        while node or stack:
            while node:
			    stack.append(node)
			    res.append(node.val)
			    node = node.left
		    # 这时候node已经变成None了,所以要把node赋值为数组的最后一个
		    node = stack.pop()
		    # 如果node.right为空,那么node赋值为空,进入下一次外层循环的时候就继续弹栈。
		    # 如果node.right不为空,那么node就赋值为右节点,进入下一次外层循环的时候遍历右子树。
			node = node.right	
        return res
def preorderTraversal(root):
    ret = []
    if root == None: return ret
    stack = []
    stack.append(root)

    while stack:
        node = stack.pop()
        ret.append(node.val)
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)
    return ret

中序遍历

中序遍历和前序遍历一样,只是把res.append(node.val)换了个位置,即在深度遍历完左子树之后保存当前节点的值。

    def preorderTraversal(self, node, k):
        # write code here
        stack = []
        res = []
        while node or stack:
            while node:
			    stack.append(node)
			    node = node.left
		    # 这时候node已经变成None了,所以要把node赋值为数组的最后一个
		    node = stack.pop()
		    res.append(node.val)
		    # 如果node.right为空,那么node赋值为空,进入下一次外层循环的时候就继续弹栈。
		    # 如果node.right不为空,那么node就赋值为右节点,进入下一次外层循环的时候遍历右子树。
			node = node.right	
        return res

后序遍历

相比于前面,多了出栈判定。
后序遍历需要弹栈时需要注意当前节点的右节点是否存在,右节点存在必须保证右节点已经出栈,此时节点出栈(每次出栈保存前一次节点用于判断),反之,进入到右节点。

    def traverseWithCallStack(self, node, k):
        # write code here
        stack = []
        res = []
        pre = None
        while node or stack:
            while node:
			    stack.append(node)
			    node = node.left
		    # 这时候node已经变成None了,所以要把node赋值为数组的最后一个
		    node = stack[-1]
		    if node.right == None or node.right == pre:
		    	stack.pop()
		    	res.append(node.val)
		    	prev = node
		    	node = None
		    else:
		    	node = node.right
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值