代码随想录算法训练营day14|二叉树

  • 递归遍历
    二叉树的遍历分为前序、中序、和后序,前中后代表双亲节点的位置。
    简单基础题
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<Integer>();
            preorder(root, result);
            return result;
        }
    
        public void preorder(TreeNode root, List<Integer> result) {
            if (root == null) {
                return;
            }
            result.add(root.val);
            preorder(root.left, result);
            preorder(root.right, result);
        }
    }

    有一定的基础了,因此只给出前序遍历的代码。

  • 迭代遍历
    迭代遍历就是不利用递归用循环结构来实现对二叉树的遍历。

    递归的底层逻辑是利用了栈的后进先出的结构来实现对二叉树的遍历,因此迭代遍历需要模拟递归运行的底层逻辑来进行。
    以前序遍历为例,在递归遍历中,显然根节点是最先被压入栈中,然后是先弹出根节点,然后输出根节点的值,同时再将根的左右结点分别压入栈中,因为左节点需要先出栈,因此进栈顺序应该为右左,按照这一个逻辑循环当每个结点展开后以及每个结点都被弹出输出,最后栈会被清空,因此循环的结束条件就是栈为空的时候。
  • 统一迭代
    由于前序遍历的特殊性,在每个双亲结点被弹出展开之后,只需要将左右子节点重新压入栈中,双亲结点可以直接进行输出不再重新压入栈中。
    但是,中序和后续遍历就无法这样,因为双亲结点并不是最先输出的,它需要按照输出的顺序重新被压入栈中保证遍历顺序的正确性。但是,在循环的过程中,遇到同一个结点时,我们无法确定这个结点此时应该进行展开还是进行弹出。
    所以,我决定在展开后的双亲结点重新入栈的时候,在它入栈前先压入一个null表示null的下一个结点已经经过展开,此时为输出状态。经过这样的处理,前中后的迭代遍历写法,只需要将代码的顺序进行移动就可以实现遍历顺序的转换。
    class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            Stack<TreeNode> stack=new Stack<TreeNode>();
            List<Integer> res=new ArrayList<Integer>();
            if(root!=null) stack.push(root);
            while(!stack.isEmpty()){
                TreeNode cur=stack.pop();
                if(cur!=null){
                    
                    stack.push(cur);
                    stack.push(null);
                    if(cur.right!=null)stack.push(cur.right);
                    if(cur.left!=null)stack.push(cur.left);
                }else{
                    res.add(stack.pop().val);
    
                }
            }
            return res;
        }
    }

    以上是以后序遍历为例子,我在一开始思考迭代遍历时已经在往统一迭代的方向靠,因此在看了carl视频后结合自己的思考第一次写出的就是统一迭代代码。

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值