代码随想录day16|513.找树左下角的值,112. 路径总和,106.从中序与后序遍历序列构造二叉树

513.找树左下角的值

题目

层序遍历

如果用迭代法(层序遍历,只用在每一层开始的地方将result记为队列中第一个出来的数即可)

递归

需要记录用一个当前深度和最大深度,只有当深度>最大深度时更新result,这样同层不会处理第一个后面的数,任意遍历顺序都可,因为左都在右之前。

int result;
int maxdepth=0;
void getans(TreeNode* root,int &depth){
	if(root->left==NULL&&root->right==NULL){
		if(depth>maxdepth){
			result=root->val;
			maxdepth=depth;
		}
		return;
	}
	
	
	if(root->left!=NULL){
		depth++;
		getans(root->left,depth);
		depth--;//回溯的过程,
	}

	if(root->right!=NULL){
		depth++;
		getans(root->right,depth);
		depth--;//回溯的过程,
	}

}

112. 路径总和

题目
该问题是找到一条符合的路径。
如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。
如果搜整棵树,则用void就行
(这题思路和之前记录所有路径一模一样,用回溯法)

int sum=0;
bool hasPathSum(TreeNode* root, int targetSum) {
		sum+=root->val;
		if(root->left==NULL&&root->right==NULL)	{
			if(sum==targetSum) return true;
			return false;
		}
        if(root->left!=NULL){
			if(hasPathSum(root->left,targetSum)){
				return true;
			}
			sum-=root->left->val;//回溯
		}
		if(root->right!=NULL){
			if(hasPathSum(root->right,targetSum)){
				return true;
			}
			sum-=root->right->val;
		}
        return false;
    }

而当要记录所有路径和==目标值的路径时,用void即可。

106.从中序与后序遍历序列构造二叉树

后序:左右中;
中序:左中右

所以中间的节点就是后序的最后一位,因为没有重复的,所以可以根据postorder.back(),找到中序中对应值的下标,将前后分为两段中序,再根据其大小建立两段后序。

void build(TreeNode* &root,vector<int> inorder,vector<int> postorder)
if(postorder.size()==0) return ;//终结条件:
int value=postorder.back();
root=new TreeNode(value);//传入中间值
int index=0;

vector<int> inorderleft;
for(;inorder[index]!=value;index++){
	inorderleft.push_back(inorder[index]);
}
//找到了index后分别建立....
build(root->left,inorderleft,postorderleft);
build(root->right,inorderright,postorright);

注意这样传入root的引用,不用引用只是赋值拷贝,对传入的数据本身没有影响,root->left在函数外还是NULL;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值