在二叉树中增加一行[前序遍历与dfs]

102 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第34天,在二叉树中增加一行[前序遍历与dfs] - 掘金 (juejin.cn)

前言

对于树/图问题,遍历是基础,每种操作都是在遍历过程中完成的。而不同的遍历过程可解决不同的问题。主要是前序&dfs,中序&平衡二叉,后序&回溯,层序&bfs。

一、在二叉树中增加一行

image.png

二、前序&dfs

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode addOneRow(TreeNode root, int val, int depth) {
        // 特殊情况,需要换根。
        if(depth == 1) return new TreeNode(val,root,null);
        // 其它情况,在二叉树遍历的基础上更新树即可。
        order(root,val,depth,1);
        // 返回根节点。
        return root;
    }
    // 在前序遍历的基础上,加入新节点即可。
    public void order(TreeNode root,int val, int depth,int cur){
        // 碰到null节点,结束递归。
        if(root == null) return;
        // 前序遍历,到达指定深度,开始新增left/right节点。
        if(cur + 1 == depth){
            // 申请新节点。
            TreeNode leftNode = new TreeNode(val),rightNode = new TreeNode(val);
            // 加入新的左右节点。
            leftNode.left = root.left;
            root.left = leftNode;

            rightNode.right = root.right;
            root.right = rightNode;

            return;
        }
        // 正常的递归方位左右节点。
        order(root.left,val,depth,cur + 1);
        order(root.right,val,depth,cur + 1);
    }
}

总结

1)二叉树问题,都是在遍历的基础上进行改进,有4种遍历方式,分别为前序&dfs,中序&平衡二叉,后序&回溯,层序&bfs。

参考文献

[1] LeetCode 在二叉树中增加一行