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

刷题继续!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值