最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)查找二叉樹中和為某一值的所有路徑的示例

 更新時間:2016年02月04日 17:29:43   作者:Zhang_H  
這篇文章主要介紹了C++實現(xiàn)查找二叉樹中和為某一值的所有路徑的示例,文中的方法是根據(jù)數(shù)組生成二叉排序樹并進行遍歷,需要的朋友可以參考下

從樹的根結點開始往下訪問一直到葉結點所經(jīng)過的所有結點形成一條路徑。
打印出和與輸入整數(shù)相等的所有路徑。
例如 輸入整數(shù)22和如下二元樹

201624172555583.png (138×105)

則打印出兩條路徑:10, 12和10, 5, 7。

先序遍歷樹即可得到結果。
算法: FindPath(BTree * root,int sum,int target,Stack * s) 用來計算,sum為棧中的元素的和,target為目標值。
到達一個節(jié)點之后計算當前節(jié)點和sum的和,如果為target,輸出路徑返回,如果大于target,則直接返回,如果小于,則將當前節(jié)點的值入棧,更新sum的值,繼續(xù)遍歷,遍歷完成之后,也就是從當前節(jié)點返回的時候,將其從棧中彈出,更新sum
代碼如下(GCC編譯通過):


#include "stdio.h"
#include "stdlib.h"
#define MAXSIZE 8
 
typedef struct node
{
 int data;
 struct node * left;
 struct node * right;
}BTree;
 
typedef struct 
{
 int top;
 int data[MAXSIZE];
}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)
{
 int array[MAXSIZE] = {5,3,8,7,2,4,1,9},target;
 BTree * root;
 Stack stack;
  
 target = 12;
 root = CreatTree(array,MAXSIZE);
 InitStack(&stack);
 
 printf("二叉樹內(nèi)元素升序排列:");
 Iorder(root);
 printf("\n");
 
 printf("目標值:%d,路徑:",target);
 FindPath(root,0,target,&stack);
 
 printf("\n");
 return 0;
}
 
//根據(jù)數(shù)組生成二叉排序樹
BTree * CreatTree(int a[],int n)
{
 BTree * root ,*p,*cu,*pa;
 int i;
  
 root = (BTree *)malloc(sizeof(BTree));
 root->data = a[0]; 
 root->left = root->right =NULL;
  
 for(i=1;i<n;i++)
 {
  p = (BTree *)malloc(sizeof(BTree));
  p->data = a[i];
  p->left = p->right =NULL;
  cu = root;
 
  while(cu)
  {
   pa = cu;
   if(cu->data > p->data)
    cu = cu->left;
   else
    cu = cu->right;
  }
  if(pa->data > p->data)
   pa->left = p;
  else
   pa->right = p;
 } 
 
 return root;
}
 
//中根遍歷,打印二叉樹
void Iorder(BTree * root)
{
 if(root)
 {  
  Iorder(root->left);
  printf("%3d",root->data);
  Iorder(root->right);
 }
}
 
//尋找路徑
void FindPath(BTree * root,int sum,int target,Stack * s)
{
 int i;
 
 if(!root)
  return ;
 if(sum + root->data == target)
 {
  Push(s,root->data);
  for(i = 0;i<s->top;i++)
   printf("%3d",s->data[i]);
  return;
 }
 
 else if(sum + root->data > target)
   {
  return;
   }
   else
   {
  Push(s,root->data);
  sum += root->data;
  FindPath(root->left,sum,target,s);
  FindPath(root->right,sum,target,s);
  sum -= root->data;
  Pop(s);
   }
}
 
//初始化棧
void InitStack(Stack * s)
{
 s->top = 0;
}
 
//入棧
void Push(Stack *s,int val)
{
 if(s->top == MAXSIZE)
 {
  printf("棧滿,無法入棧!\n");
  return;
 }
 s->data[(s->top)++] = val;
 
}
 
//出棧
int Pop(Stack *s)
{
 if(s->top == 0)
 {
  printf("??眨瑹o法出棧!\n");
  return;
 }
  
 return s->data[--(s->top)];
}

 

相關文章

  • C++函數(shù)模板與類模板相同與不同介紹

    C++函數(shù)模板與類模板相同與不同介紹

    C++語言的模板技術包括函數(shù)模板和類模板,模板技術是一種代碼重用技術,函數(shù)和類是C++語言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-08-08
  • Objective-C的內(nèi)省(Introspection)用法小結

    Objective-C的內(nèi)省(Introspection)用法小結

    這篇文章主要介紹了Objective-C的內(nèi)省(Introspection)用法,這是面向對象語言和環(huán)境的一個強大特性,需要的朋友可以參考下
    2014-07-07
  • Qt進程和線程QProcess和QThread的使用

    Qt進程和線程QProcess和QThread的使用

    本文主要介紹了Qt進程和線程QProcess和QThread的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • 基于C++實現(xiàn)BMI身體質(zhì)量指數(shù)計算工具

    基于C++實現(xiàn)BMI身體質(zhì)量指數(shù)計算工具

    BMI(Body?Mass?Index,身體質(zhì)量指數(shù)),也稱為體重指數(shù),是一種常用的衡量成人人體肥胖程度的指標,本文就來用C++編寫一個簡單的BMI計算工具吧
    2023-10-10
  • C++多線程編程時的數(shù)據(jù)保護

    C++多線程編程時的數(shù)據(jù)保護

    這篇文章主要介紹了C++多線程編程時的數(shù)據(jù)保護,作者針對C++11版本中的新特性做出了一些解說,需要的朋友可以參考下
    2015-07-07
  • C++ 程序員為什么看不起php程序員

    C++ 程序員為什么看不起php程序員

    由于當今市場狀況,各種培訓班飛起,PHPer越來越多,學習成本很低。導致了很多人對PHP的誤解。其實PHP學到深入的時候,所需知識很多,并不是表面看到的那樣。另外,PHP確實嚴謹性不高,這個跟C++,java確實都沒法比。但是,PHP在web開發(fā)中的效率,是其他語言所不能比的
    2017-02-02
  • C++ cin不同狀態(tài)詳細講解

    C++ cin不同狀態(tài)詳細講解

    cin是C++編程語言中的標準輸入流對象,即istream類的對象。cin主要用于從標準輸入讀取數(shù)據(jù),這里的標準輸入,指的是終端的鍵盤。此外,cout是流的對象,即ostream類的對象,cerr是標準錯誤輸出流的對象,也是ostream類的對象
    2022-10-10
  • C++二分查找算法實例

    C++二分查找算法實例

    這篇文章主要為大家詳細介紹了C++二分查找算法的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • ?C++模板template原理解析

    ?C++模板template原理解析

    這篇文章主要介紹了C++模板template原理,函數(shù)模板代表了一個函數(shù)家族,該函數(shù)模板與類型無關,在使用時被參數(shù)化,根據(jù)實參類型產(chǎn)生函數(shù)的特定類型版本
    2022-07-07
  • c++實現(xiàn)解析zip文件的示例代碼

    c++實現(xiàn)解析zip文件的示例代碼

    這篇文章主要為大家詳細介紹了如何利用c++實現(xiàn)解析zip文件,并對流式文件pptx內(nèi)容的修改,文中的示例代碼講解詳細,有需要的小伙伴可以參考一下
    2023-12-12

最新評論

乌拉特前旗| 平遥县| 察雅县| 新郑市| 综艺| 嵊泗县| 铁岭县| 侯马市| 家居| 洪洞县| 马公市| 喀喇沁旗| 婺源县| 三穗县| 维西| 调兵山市| 郴州市| 宕昌县| 武邑县| 萍乡市| 新化县| 郎溪县| 南岸区| 石阡县| 荔波县| 武定县| 安国市| 洛南县| 青河县| 荆州市| 三都| 开封市| 鲜城| 天气| 永兴县| 梁平县| 肃南| 綦江县| 金秀| 三江| 金溪县|