手撕LeetCode(4) 二叉树系列-1
手撕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; }