颜色标记法-二叉树前序,中序,后续遍历的非递归模板

        对于我来说,传统的二叉树三序遍历的递归写法统一了模板,简短易理解;但非递归写法经常一看就会,一写就废,反反复复的复习感觉特别麻烦,在leetcode刷题时偶然看到了这个大佬的题解,颜色标记法,大佬是用python实现的,我按照大佬的思想写出了Java实现,并且改进了一下大佬的写法,有兴趣的朋友们也可以按照这个思想写出c++,js等版本的解法!

颜色标记法的思想:

        ①访问过的节点标记为白色,未访问的节点标记为灰色。

        ②取出栈顶元素时,判断是哪个颜色,灰色则输出,白色则按遍历方式与左右孩子压入栈。

改进版:

        ①因为大多数情况,节点类型是TreeNode,数据类型一般不为TreeNode,这里题目的数据类型是int,于是可以用类型判断来替代颜色标记,即从栈中取出栈顶元素,类型是TreeNode则按白色节点处理,类型是数据类型则按灰色节点处理。

        ②栈的泛型为Object,这样就可以存储不同类型的元素。

以下是我的代码模板。

---------------------------------------------------------------------------------------------------------------------------------

前序

class Solution {
    
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        List stack<Object> = new ArrayList<>();
        stack.add(root);

        while(stack.size() != 0){
            Object top = stack.remove(stack.size()-1); //栈顶元素

            if(top instanceof TreeNode){ // 编译器会判断左边的对象能否转化为右边的类型
                TreeNode node = (TreeNode) top;
                stack.add(node.right); // 只需交换这三句话的顺序,就可实现前序,中序,后序
                stack.add(node.left);
                stack.add(node.val); // 按栈先进后出的特点,这里的顺序是中左右
            }else if(top instanceof Integer){
                res.add((Integer)top);
            }
        }
        return res;
    }
}

可以在leetcode上测试这段代码

二叉树前序遍历

---------------------------------------------------------------------------------------------------------------------------------

中序

class Solution {
    
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        List stack = new ArrayList<>();
        stack.add(root);

        while(stack.size() != 0){
            Object top = stack.remove(stack.size()-1); //栈顶元素

            if(top instanceof TreeNode){ // 编译器会判断左边的对象能否转化为右边的类型
                TreeNode node = (TreeNode) top;
                stack.add(node.right);
                stack.add(node.val); //按栈先进后出的特点,这里的顺序是左中右
                stack.add(node.left);
            }else if(top instanceof Integer){
                res.add((Integer)top);
            }
        }
        return res;
    }
}

可以在leetcode上测试这段代码

二叉树中序遍历

---------------------------------------------------------------------------------------------------------------------------------

后序

class Solution {
    
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        List stack = new ArrayList<>();
        stack.add(root);

        while(stack.size() != 0){
            Object top = stack.remove(stack.size()-1); //栈顶元素

            if(top instanceof TreeNode){ // 编译器会判断左边的对象能否转化为右边的类型
                TreeNode node = (TreeNode) top;
                stack.add(node.val); //按栈先进后出的特点,这里的顺序是左右中
                stack.add(node.right);
                stack.add(node.left);
            }else if(top instanceof Integer){
                res.add((Integer)top);
            }
        }
        return res;
    }
}

可以在leetcode上测试这段代码

二叉树后续遍历

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值