手撕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;
}

刷题继续!!

经验分享 程序员 微信小程序 职场和发展