劍指offer面試題之二叉樹中和為某一值的所有路徑

2021-07-10 22:50:29 字數 954 閱讀 6864

1,問題:

輸入一顆二叉樹和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。

2,想法:

(1)一條路徑肯定是從根節點到葉子節點,我們記錄從根到葉子節點路徑上值得累加,到了葉子節點時,判斷是否等於number,從而確定是否是一條合法路徑,但是有乙個難點是記錄路徑上的節點。

我們從樹的先序遍歷上得到啟發,若已經判定了一條路徑是否合法了,那麼我們接下來應該判斷它的父親的另乙個孩子分支路徑是否合法。

那麼這樣的特徵很適合用棧來儲存路徑上的節點,一旦判定了一條路徑,就出葉子節點,繼續判斷它父親的另乙個孩子。遞迴實現。

3,編碼:

/*

struct treenode

};*/

class solution

else

return false;

}//下邊是遞迴求出每一條路徑,自己畫圖慢慢修改**

void findpath(treenode* root, int &number, vector> &result, vector&temp)

else if (isleaf(root) && number != 0)

else if (!isleaf(root))//若不是葉子節點,則遞迴下去

if (root->right != null)

//左右孩子都處理完了,需要回到它的父親節點

temp.pop_back();

number += root->val;

return;}}

vector> findpath(treenode* root,int expectnumber)

findpath(root, expectnumber, result, temp);

return result;

}};

《劍指Offer》面試題 平衡二叉樹

題目 輸入乙個二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。思路 用後序遍歷實現 先遍歷節點的左右子樹,左右子樹都平衡才來判斷該節點是否平衡,如果左右子樹中有不平衡的,則直接返回false,避免了從上往下逐個節點地計算深度帶來...

劍指Offer 面試題 樹和二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。基礎知識 在二叉樹的前序遍歷序列中,第乙個數字總是樹的根節點的值。在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的...

《劍指Offer》面試題 二叉樹的深度

題目描述 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。思路 此題的遞迴思想比較簡單,直接用遞迴將根節點的深度轉換為求左右子孩子的深度的較大值 1,根節點的深度等於max 左孩子的深度,右孩子的深度 輸入 第一行輸入有n,n表...