513.找樹(shù)左下角的值
思路:
1.迭代法
每一層遍歷開(kāi)始尸折,先存放result,再開(kāi)始遍歷殷蛇,最后返回result实夹。
2.遞歸法
定義一個(gè)pair<val,depth>,定義函數(shù)為
void?find(TreeNode*?root,pair<int,int>&pairs)
邊界:root==NULL return粒梦;
順序:左右中
用depth回溯
判斷條件: 如果當(dāng)前depth大于已記錄的depth亮航,則返回新pair,效果是只記錄每一層第一個(gè)碰到的節(jié)點(diǎn)谍倦。
if(depth>pairs.second)pairs={root->right->val,depth};
看視頻后:
邊界條件有兩個(gè):
1.root==NULL 樹(shù)不存在 return
2.root->left==NULL&&root->right==NULL 葉子節(jié)點(diǎn)
是葉子節(jié)點(diǎn)時(shí)需要判斷當(dāng)前的depth和已記錄的節(jié)點(diǎn)的depth誰(shuí)大塞赂。
可以不用pair,用兩個(gè)參數(shù)即可昼蛀。
112. 路徑總和
重新定義一個(gè)函數(shù)宴猾,函數(shù)參數(shù)為
void pathSum(TreeNode*?root,int?&sum, vector<int>&result)
result用于存儲(chǔ)所有路徑總和
中止條件:
if(root==NULL) return;
if(root->left==NULL&&root->right==NULL)
result.push_back(sum);
使用sum進(jìn)行回溯;
左:
if(root->left)
????????{
????????????sum+=root->left->val;
????????????pathSum(root->left,sum,result);
????????????sum-=root->left->val;
????????}
最后在主函數(shù)里比較result里是否有與targetSum相等的值
看視頻后:
?在左右遍歷的時(shí)候加上判斷條件
if(hasPathSum(root->left,targetSum))?return?true;
則將下層true返回上層叼旋,不需要全部路徑遍歷仇哆,只要找到一條就可以返回
113. 路徑總和.2
回溯的時(shí)候不僅回溯targetsum,而且回溯記錄的members夫植。不要忘記傳入根節(jié)點(diǎn)的數(shù)值讹剔。
106.從中序與后序遍歷序列構(gòu)造二叉樹(shù)
思路:
能在紙上畫出來(lái)但不知道代碼怎么寫
看視頻后:
處理邏輯:
第一步:如果數(shù)組大小為零的話,說(shuō)明是空節(jié)點(diǎn)了详民。
第二步:如果不為空延欠,那么取后序數(shù)組最后一個(gè)元素作為節(jié)點(diǎn)元素。
第三步:找到后序數(shù)組最后一個(gè)元素在中序數(shù)組的位置沈跨,作為切割點(diǎn)
第四步:切割中序數(shù)組由捎,切成中序左數(shù)組和中序右數(shù)組 (順序別搞反了,一定是先切中序數(shù)組)
第五步:切割后序數(shù)組饿凛,切成后序左數(shù)組和后序右數(shù)組
第六步:遞歸處理左區(qū)間和右區(qū)間
1. 注意葉子節(jié)點(diǎn)? if(postorder.size()==1)returnroot;
2.如何定義vector 如vector<int>leftInorder(inorder.begin(),inorder.begin()+delimiterIndex);
3.中序數(shù)組大小一定是和后序數(shù)組的大小相同的狞玛!用中序數(shù)組的切割結(jié)果來(lái)切割后序數(shù)組!
4. 記得處理root節(jié)點(diǎn) postorder.resize(postorder.size()-1);
105同理涧窒。