【題目】
struct binarytreenode
;
以下圖中二叉樹為例
【分析】
從數的根結點開始往下一直到葉結點所經過的結點形成一條路徑,在二叉樹遍歷方法中只有前序遍歷從根節點開始,所以按照前序遍歷訪問時,訪問順序為10,5,4,7,12,而觀察二叉樹所有路徑中,等於22的有兩條路徑:{10,5,7}和{10,12},訪問過程如下:
1. 訪問根結點10,新增到路徑path中,記錄下此時路徑和為10;
2. 按照前序遍歷依次訪問,訪問5,新增到路徑path中,路徑和為15;
3. 訪問4為葉子結點,新增到路徑path中,路徑和為19不等於22,故從路徑path中刪除結點4,返回結點5,訪問父節點5的右孩子7,新增到路徑path中,路徑和就為15+7 =22,將路徑path中資料依次輸出,路徑10-5-7;
4. 刪除路徑中記錄的結點資料,留下結點10,訪問其右孩子12,新增到路徑path中,路徑和為22,輸出路徑10-12;
由上分析可以發現,路徑path的功能類似於棧,遞迴呼叫本身就是乙個棧的實現過程。
【測試**】
#include
#include
using
namespace
std;
struct binarytreenode
;binarytreenode* createbinarytreenode(int value)
void connectbinarytreenode(binarytreenode* pparent, binarytreenode* pleftchild,
binarytreenode* prightchild)
void findpath(binarytreenode * proot, int expectedsum, vector
path, int currentsum)
//如果不是葉結點,則遍歷它的子結點
if( proot->m_pleft != null)
findpath(proot->m_pleft, expectedsum, path, currentsum);
if( proot->m_pright != null)
findpath(proot->m_pright, expectedsum, path, currentsum);
//在返回到父結點之前,在路徑上刪除當前結點
path.pop_back( );
}void findtreepath(binarytreenode* proot, int expectedsum)
void test()
int main()
【輸出】
二叉樹中和為某一值的路徑
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...
二叉樹中和為某一值的路徑
要輸出所有的路徑,必須額外用乙個棧來儲存當前路徑資訊。當訪問到節點a時,節點a的資訊要在訪問a的左右子樹時用到,因而,該資訊必須在遍歷a的左右子樹前加入到棧中,而在遍歷完a的左右子樹後從棧中移除。每訪問乙個節點,就計算當前路徑值 可直接利用父節點的路徑值 當其等於給定值且當前節點是葉子節點時,就列印...
二叉樹中和為某一值的路徑
面試題25 二叉樹中和為某一值的路徑 struct binarytreenode int value binarytreenode pleft binarytreenode pright 分析 用先序遍歷的方式遍歷二叉樹,初始時路徑為空。訪問乙個結點時若不到葉子結點且結點的和小於這個值那麼就把這個結...