如圖,輸入上圖的二叉樹和整數 22,則列印出兩條路徑,第一條路徑:10, 12; 第二條路徑為:10, 5, 7.
由於路徑是從根節點出發到葉節點,也就是說路徑總是以根節點為起始點,因此首先需要遍歷根節點。在樹的前序,中序,後序三種遍歷方式中,只有前序遍歷是首先訪問根節點。
遍歷過程如下表:
分析上述過程,規律:當用前序遍歷的方式訪問到某一節點時,我們把這個節點新增到路徑上,並累加該節點的值,如果該節點為葉子節點並且路徑中節點值的和剛好等於輸入的整數,則當前的路徑符合要求,我們把它列印出來。如果當前節點不是葉節點,則繼續訪問它的子節點。當前節點訪問結束後,遞迴函式將自動回到它的父節點。因此我們在函式退出之前要在路徑上刪除當前節點,並減去當前節點的值,以確保返回父節點時路徑剛好是從根節點到父節點的路徑。不難看出儲存路徑的資料結構實際上是乙個棧,因為路徑要與遞迴呼叫狀態一致,而遞迴呼叫的本質就是乙個壓棧和出棧的過程。
//輸入一棵二叉樹和乙個整數,列印二叉樹中節點值的和為輸入整數的所有路徑
//如果不是葉節點,則遍歷其子節點#include#includeusing namespace std;
typedef int elemtype;
typedef struct tnode
treenode, *binarytree;
treenode* binarytreenode(elemtype e)
void connecttreenode(treenode* pparent, treenode* pleft, treenode* pright)
void findtreepath(treenode *proot, int exceptionnum, vector& path, int currentnum)
cout << endl;
}
//在返回到父節點之前,在路徑上刪除當前節點if(proot->leftchild != null)
findtreepath(proot->leftchild, exceptionnum, path, currentnum);
if(proot->rightchild != null)
findtreepath(proot->rightchild, exceptionnum, path, currentnum);
path.pop_back();
}void findpath(treenode *proot, int exceptionnum)
int main()
劍指 二叉樹中和為某一值的路徑
題目描述 輸入一顆二叉樹的跟節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。注意 在返回值的list中,陣列長度大的陣列靠前 解法一 帶記憶的 dfs,dfs 問題的經典解法 class solution void d...
劍指 二叉樹中和為某一值的路徑
輸入一顆二叉樹的跟節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。注意 在返回值的list中,陣列長度大的陣列靠前 c public vector res vectorpath void verify treenode...
二叉樹中和為某一值的路徑
include include using namespace std struct node void find path node r,int exceptedsum,vector path,int cursum node buildbtree int a,int i void preorder...