從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。
列印出和與輸入整數相等的所有路徑。
例如 輸入整數22和如下二元樹
則列印出兩條路徑:10, 12和10, 5, 7。
先序遍歷樹即可得到結果。
演算法: findpath(btree * root,int sum,int target,stack * s) 用來計算,sum為棧中的元素的和,target為目標值。
到達乙個節點之後計算當前節點和sum的和,如果為target,輸出路徑返回,如果大於target,則直接返回,程式設計客棧如果小於,則將當前節點的值入棧,更新sum的值,繼續遍歷,遍歷完成之後,也就是從當前節點返回的時候,將其從棧中彈出,更新sum
**如下(gcc編譯通過):
#include "stdio.h"
#include "stdlib.h"
#define maxsize 8
typedef struct node
btree;
typedef struct
stack;
btree * creattree(int a,int n);
void iorder(btree * root);
void porder(btree * root);
void findpath(btree * root,int sum,int target,stack * stack);
void initstack(stack * stack);
void push(stack * s,int val);
int pop(stack *s);
int main(void)
,target;
btree * root;
stack stack;
target = 12;
root = creattree(array,maxsize);
initstack(&stack);
printf("二叉樹內元素公升序排列:");
iorder(root);
printf("\n");
printf("目標值:%d,路徑:",target);
findpath(root,0,target,&stack);
printf("\n");
return 0;}
//根據陣列生成二叉排序樹
btree * creattree(i程式設計客棧nt a,int n)
if(pa->data > p->data)
pa->left = p;
else
pa->right = p;
} return root;}
//中根遍歷,列印二叉樹
void iorder(btree * root)}
//尋找路徑
void findpath(btree * root,int sum,int target,stack * s)
else if(sum + root->data > target)
else
}//初始化棧
void initstack(stack * s)
//入棧
void push(stack *s,int val)
s->data[(s->top)++] = val; }
//出棧
int pop(stack *s)
return s->data[--(s->top)];
}本文標題: c++實現查詢二叉樹中和為某一值的所有路徑的示例
本文位址:
二叉樹中和為某一值的路徑 C
題目 輸入一顆二叉樹的根節點和乙個整數,列印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。思路 使用遞迴方法,從根節點出發,逐步向子節點遍歷,使用動態陣列儲存所經過的節點,並儲存每一步時當前的路徑節點之和,當到達葉節點時,該路徑上所有節...
二叉樹中和為某一值的路徑
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的左右子樹後從棧中移除。每訪問乙個節點,就計算當前路徑值 可直接利用父節點的路徑值 當其等於給定值且當前節點是葉子節點時,就列印...