携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第34天,在二叉树中增加一行[前序遍历与dfs] - 掘金 (juejin.cn)
前言
对于树/图问题,遍历是基础,每种操作都是在遍历过程中完成的。而不同的遍历过程可解决不同的问题。主要是前序&dfs,中序&平衡二叉,后序&回溯,层序&bfs。
一、在二叉树中增加一行
二、前序&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。