手撕LeetCode(4) 二叉树系列-1
递归的真谛:明确函数的定义,利用这个定义推导最终结果。
注意:细化每个操作的实现。
实践
1. 翻转二叉树 (leetcode 226题)
题目:镜像翻转一个二叉树
方法:为前序遍历,二叉树的每个节点的左右子树的交换。
上代码:
TreeNode invertTree(TreeNode root){
//base case
if(root==null) return null;
//前序遍历
//交换节点
TreeNode temp;
temp=root.left;
root.left=root.right;
root.right=temp;
//递归的执行左子树,右子树
inverTree(root.left);
inverTree(root.right);
return root;
}
2.填充每个节点的下一个右侧结点指针(leetcode 116题)
题目:在一个完美二叉树(所有叶子节点都在一层,每个父节点都有两个子节点),讲每一层的节点用next指针连接起来。
方法:仍然采用递归的方法,为前序遍历,当只采用一个节点(根节点)进行递归时,对于同一层的不同子树之间节点无法连接,所以要进一步具体化,那就是根节点的两个子树的节点。通过这两个节点进行递归。
上代码:
Node connect(Node root){
if(root==null) return null;
connect_twonode(root.left,root.right);
return root;
}
void connnet_twonode(Node node1,Node node2){
if(node1==null || node2==null) return;
//连接root的俩个节点
node1.next=node2;
//子树内部间的节点连接
connnect_twonode(node1.left,node1.right);
connnect_twonode(node2.left,node2.right);
//子树间的节点连接
connnect_twonode(node1.right,node2.left);
}
3.二叉树展开为链表(leetcode 114题)
题目:将给定的二叉树展开为一个单链表。
方法: 0) 分析递归的方法为后续遍历。
1)将左子树,右子树的拉平。
2)将左子树接到节点的右侧。
3)之后将右子树接到左子树串的后面。
void flatten(TreeNode root){
if(root==null) return;
flatten(root.right);
flatten(root.left);
//1.拉平操作
TreeNode left=root.left;
TreeNode right=root.right;
//2.接操作
root.left=null; //破坏左子树
root.right=left
//3.接操作
TreeNode p=root;
while(p.right!=null){
p=p.right;
}
p.right=right;
}