【演算法】在二元樹中找出和為某一值的所有路徑
參考文章:
http://xingyunbaijunwei.blog.163.com/blog/static/7653806720122284428687/
輸入一個整數和一棵二元樹。從樹的根結點開始往下訪問一直到葉結點所經過的所有結點形成一條路徑。
列印出和與輸入整數相等的所有路徑。
例如輸入整數22 和如下二元樹
10
/ \
5 12
/ \
4 7
則列印出兩條路徑:10, 12 和10, 5, 7。
思路:
1、當訪問到某一節點時,把該結點的值新增到當前和變數,且把該結點壓入棧中。
2、若結點為葉子結點,且當前和變數==期望的和,則列印棧中的結點值,即為所需的路徑。
3、若結點不是葉子結點,繼續訪問它的左孩子結點,訪問它的右孩子結點。
4、刪除該結點。包括從當前和變數中減去結點值,從棧中彈出結點值。此時,已回到父結點。
#include <stdio.h>
#include <stdlib.h>
static count=0;
typedef struct node
{
int key;
struct node *pleft;
struct node *pright;
}Node;
int CreateTreeByInsertData(Node **p,int k)//理解為什麼用二級指標
{
if(*p==NULL)
{
*p=(Node *)malloc(sizeof(Node));
(*p)->key=k;
(*p)->pleft=(*p)->pright=NULL;
return 1;
}
else if(k == (*p)->key)
return 0;
else if(k < (*p)->key)
return CreateTreeByInsertData(&(*p)->pleft,k);
else
return CreateTreeByInsertData(&(*p)->pright,k);
}
void InOrderTravel(Node *p)//中序遍歷樹
{
if(p == NULL)
return ;
InOrderTravel(p->pleft);
printf("%d ",p->key);
InOrderTravel(p->pright);
}
void ClearTree(Node** tree)//刪除樹的操作,
{
if(*tree==NULL)return;
ClearTree(&(*tree)->pleft);
ClearTree(&(*tree)->pright);
free(*tree);
*tree=NULL;
}
void printPath(int path[],int top)
{
int i;
count++;
printf("這是第%d組:",count);
for(i=0;i<top;i++)
printf("%d ",path[i]);
printf("\n");
}
void findPath(Node *root, int sum,int top,int path[])//回溯遍歷的核心
{
path[top++] = root->key;
sum -= root->key;
if (root->pleft == NULL && root->pright==NULL)
{
if (sum == 0)
{
printPath(path, top);
}
}
else
{
if (root->pleft != NULL)
findPath(root->pleft, sum, top,path);
if (root->pright!=NULL)
findPath(root->pright, sum, top,path);
}
top --;
sum += root->key;
}
int main()
{
int i;
Node *proot = NULL;
/*Node *ListHead = NULL;
Node *ListTail = NULL;*/
int data[] = {10,5,12,4,7};
int path[20]={0};
//依次插入一些資料,建立一個二叉排序樹
for(i=0; i<sizeof(data)/sizeof(int); i++)
//CreateTreeByInsertData(proot, data[i]);
CreateTreeByInsertData(&proot, data[i]);
InOrderTravel(proot);
findPath(proot,22,0,path);
ClearTree(&proot);
return 0;
}
相關文章
- 【微軟面試一百題:4】在二元樹中找出和為某一值的所有路徑微軟面試
- 二叉樹和為某種所有路徑二叉樹
- Python演算法和資料結構:在二叉樹中找到和為sum的所有路徑Python演算法資料結構二叉樹
- 面試題34:二叉樹中和為某一值的路徑面試題二叉樹
- 【劍指offer】二叉樹中和為某一值的路徑二叉樹
- JZ-024-二叉樹中和為某一值的路徑二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑二叉樹
- 列印二叉樹的所有路徑二叉樹
- 劍指 Offer 34. 二叉樹中和為某一值的路徑(java解題)二叉樹Java
- (python版)《劍指Offer》JZ24:二叉樹中和為某一值的路徑Python二叉樹
- 程式設計有路,開源為徑程式設計
- 【vue】在二叉樹中根據子節點找出父節點路徑Vue二叉樹
- vue專案中@符號沒有路徑提示Vue符號
- 【演算法】輸入一顆二元查詢樹,將該樹轉換為它的映象演算法
- 257. Binary Tree Paths(列印二叉樹所有路徑)二叉樹
- 找出一堆整數中兩個元素和為指定值的所有組合
- 牛客題霸 [二叉樹中是否存在節點和為指定值的路徑] C++題解/答案二叉樹C++
- 387,二叉樹中的最大路徑和二叉樹
- 演算法筆記 - 樹的直徑演算法筆記
- Java或Web中解決所有路徑問題 (轉載)JavaWeb
- 演算法資料結構試題——在陣列中找出已知和的組成數演算法資料結構陣列
- 在陣列中尋找和為指定值的兩個數陣列
- LintCode 二叉樹中的最大路徑和二叉樹
- 124. 二叉樹中的最大路徑和二叉樹
- 在程式設計中為所欲為[聖誕版]程式設計
- 二元函式的極值與最值問題函式
- Linux中如何找出系統所支援的最大記憶體Linux記憶體
- [Python手撕]二叉樹中的最大路徑和Python二叉樹
- js中找出最大值程式碼例項JS
- 從陣列中找出N個數,其和為M的所有可能陣列
- 使用AWK計算某一列的所有數值和
- 樹的直徑
- 引數為二叉樹和一個整數,求所有和為該整數的路徑二叉樹
- 在陣列中找出唯一的重複元素陣列
- 在android的spinner中,實現取VALUE值和TEXT值。Android
- 在Oracle中找出重複的紀錄的方法(轉)Oracle
- 關於樹上路徑異或和的思考
- 給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。陣列