二叉樹路徑和問題

2021-06-22 22:00:45 字數 1464 閱讀 6519

今天回顧了一下二叉樹給定sum的問題,邏輯還是有問題,本以為對的,寫了如下的**

bool haspathsum(treenode *root, int sum) 

if(path==sum) return true;

p=s.top();

s.pop();

if(p->left!=null)

path-=p->left->val;

p=p->right;

}return false;

}

但是發現其實,path記錄的時候有問題,尤其是右子樹回退的時候是回退兩次,所以這個就掛了

一開始分析,發現這裡面三個資料結構要跟蹤,p, stack內容,path值,所以還是沒弄清楚,除了bug

確實while結束之後,就是訪問葉子結點的位置,而且左子樹回退的時候,就是path-=p->left->val,如果left有的話,沒有就不減。

但是我用資料跑了下,右邊的都detect不到,分析見下圖

也就是說,從右子樹4回退,指標回一次回退兩次到1,因為之前的2在走2->4的時候,已經從stack pop出來了,所以回到1的時候,只減了2,沒減4,就在這時我突然想到可以直接再- p->left->right->val啊,之前怎麼沒想到,就這麼在寫部落格的時候想到了解決方案,但是不確定是否完全正確。感覺要麼從左子樹回退,看是否空來- 要麼右子樹回退,就是回退兩次,然後path- = 兩次

但是從leetcode反饋來看,似乎還有問題。

分析出來,似乎還有從右子樹的右子樹回退兩次的情況,因此還是會掛,所以這條路不確定是否可以走通

於是乎回顧了當年4月份的帖子,寫的基於先序遞迴演算法的pathsum**,然後記錄所有路徑也是,但是記錄路徑可能用vector來模擬棧比較好,可以直接push_back,stack沒有迭代器,沒法copy到乙個vector,除非乙個乙個pop出來,放在queue裡,但是還要push回去,很麻煩,所以vector了。另外vector還可以模擬類似佇列的結構,例如程式設計之美層序遍歷列印層結束的**;

struct treenode 

};bool haspathsum=false;

vector>allpathvec;

vectorpathvec;

void preorder(treenode* root, int sum, int &path)

preorder(root->left,sum,path);

preorder(root->right,sum,path);

path-=root->val;

pathvec.pop_back(); }}

vector> haspathsum_recursivecall(treenode *root, int sum)

二叉樹路徑和問題

問題一 二叉樹中最大路徑和 leetcode124 問題描述 給定乙個非空二叉樹,返回其最大路徑和。本題中,路徑被定義為一條從樹中任意節點出發,達到任意節點的序列。該路徑至少包含乙個節點,且不一定經過根節點。大體思路 其最大路徑和有以下四種可能 1 由當前結點的左子樹結點到右子樹結點 2 由當前結點...

二叉樹路徑和

二叉樹中和為某一值的路徑 輸入一棵二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始往下一直到葉節點所經過的節點形成一條路徑。示例 給定如下二叉樹,以及目標和sum 22,5 4 8 11 13 4 7 2 5 1返回 5,4,11,2 5,8,4,5 public l...

二叉樹路徑搜尋問題

1 求任意二叉樹中的所有路徑 細想一下,這其實是乙個dfs問題。有乙個helper函式,用來向list中新增string。這裡為什麼要用靜態的string而不是動態的stringbuilder?另乙個問題是,要動態地新增內容給list,從思路上講應該是回溯法。回溯用動態子結構比如list的話,就需要...