模板
/* 二叉树遍历框架 */
void traverse(TreeNode root) {
// 前序遍历
traverse(root.left)
// 中序遍历
traverse(root.right)
// 后序遍历
}
填充右侧结点的指针,可以使用前序遍历或者后序遍历位置中序遍历位置,添加递归代码。
class Solution {
public Node connect(Node root) {
if(root == null){
return null;
}
connectTwoNode(root.left,root.right);
return root;
}
public void connectTwoNode(Node node1,Node node2){
if(node1 != null&&node2 != null){
node1.next = node2;
connectTwoNode(node1.left,node1.right);
connectTwoNode(node2.left,node2.right);
connectTwoNode(node1.right,node2.left);
}
return;
}
}
只能在前序遍历或后序遍历位置插入递归代码中结点处理的事情,因为中序遍历相当于左子树完成交换,然后左右子树再交换,再对右子树进行翻转。此时的右子树为刚刚翻转过的左子树,因此不行。
class Solution {
public TreeNode invertTree(TreeNode root) {
//细化每个结点需要做的事情
if(root == null){
return null;
}
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
还没有操作右子树之前,不能破坏右子树指针的指向,因此代码只能放在后序遍历的位置。
class Solution {
public void flatten(TreeNode root) {
//还没操作右子树前不能破坏右子树的指向,因此采用后序遍历
if(root == null){
return;
}
flatten(root.left);
flatten(root.right);
TreeNode left = root.left;
TreeNode right = root.right;
root.left = null;
root.right = left;
TreeNode p = root;
while(p.right != null){
p = p.right;
}
p.right = right;
}
}