SCL让你1分钟学会-非递归中根遍历二叉树_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > SCL让你1分钟学会-非递归中根遍历二叉树

SCL让你1分钟学会-非递归中根遍历二叉树

 2019/12/11 0:51:03  源代码清单  程序员俱乐部  我要评论(0)
  • 摘要:题目题目:非递归中根遍历二叉树,树结构如下:遍历结果:2030405080100120猜想非递归先根遍历使用栈是可以的,中根也可以吧?简化1.这棵树太复杂了,简单一点更容易理解.于是打印结果:3050100。打印这样的结果,需要50进栈,30进栈,30出栈,50出栈,100进栈再出栈落实一下代码逻辑根节点50进栈,左孩子30进栈,左子树30没有左孩子,30弹栈栈不为空,50弹栈可是100如何进栈呢?应该是50弹栈的时候,检查是否右孩子,如果有右孩子,将右孩子压栈弹栈时,检查是否存在右孩子
  • 标签:遍历 递归 二叉树

题目

题目:非递归中根遍历hashu.html" target="_blank">二叉树,树结构如下:

?

image.pngclass="image lake-drag-image" style="border: none; width: 395px; height: 238px;">

遍历结果:20 30 40 50 80 100 120

猜想

非递归先根遍历使用栈是可以的,中根也可以吧?

简化

1.这棵树太复杂了,简单一点更容易理解.于是

image.png

?

打印结果:30 50? 100。

打印这样的结果,需要50进栈,30进栈,30出栈,50出栈,100进栈再出栈

落实一下代码逻辑

根节点50进栈,左孩子30进栈,左子树30没有左孩子,30弹栈

栈不为空,50弹栈

可是100如何进栈呢?应该是50弹栈的时候,检查是否右孩子,如果有右孩子,将右孩子压栈

?

弹栈时,检查是否存在右孩子,如果有右孩子,将右孩子压栈。我们可以试试给30增加一个右孩子,比如下图:

image.png

我们再试试30弹栈的同时,将40压栈是否合适?

image.png

这个方法,可以耶,上代码,Python版本

?

class Solution(object):
    """
        50
       /  \
     30   100
    / \   / \
   20 40 80 120       
    """
    def midOrderNoRecursion(self, root):
        if not root:
            return
        stack = list()
        cur_node = root
        while stack or cur_node:
            if cur_node:
                stack.append(cur_node)
            if cur_node and cur_node.left:
                cur_node = cur_node.left
            else:
                node = stack.pop()
                print(node.val)
                if node.right:
                    cur_node = node.right
                else:
                    cur_node = None

Java版本

?

public void midOrderNoRecursion(TreeNode root) {
        if (root == null) {
            return;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curNode = root;
        while (!stack.isEmpty() || curNode != null) {
            if (curNode != null) {
                stack.add(curNode);
            }
            if (curNode != null && curNode.left != null) {
                curNode = curNode.left;
            } else {
                TreeNode node = stack.pop();
                System.out.println(node.val);
                if (node.right != null) {
                    curNode = node.right;
                } else {
                    curNode = null;
                }
            }
        }
    }

?

qrcode_for_gh_0ab55444743f_344.jpg

关注源代码清单,技术人的学习清单

上一篇: .NET Core 3.1发布,支持三年的LTS版本 下一篇: 没有下一篇了!
发表评论
用户名: 匿名