C++实现查找二叉树中和为某一值的所有路径的示例

 更新时间:2016年02月04日 17:29:43   作者:Zhang_H  
这篇文章主要介绍了C++实现查找二叉树中和为某一值的所有路径的示例,文中的方法是根据数组生成二叉排序树并进行遍历,需要的朋友可以参考下

从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数22和如下二元树

201624172555583.png (138×105)

则打印出两条路径: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
{
 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("二叉树内元素升序排列:");
 Iorder(root);
 printf("\n");
 
 printf("目标值:%d,路径:",target);
 FindPath(root,0,target,&stack);
 
 printf("\n");
 return 0;
}
 
//根据数组生成二叉排序树
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("栈空,无法出栈!\n");
  return;
 }
  
 return s->data[--(s->top)];
}

 

相关文章

  • C++函数模板与类模板相同与不同介绍

    C++函数模板与类模板相同与不同介绍

    C++语言的模板技术包括函数模板和类模板,模板技术是一种代码重用技术,函数和类是C++语言中两种主要的重用代码形式,这篇文章主要介绍了C++函数模板和类模板,需要的朋友可以参考下
    2022-08-08
  • Objective-C的内省(Introspection)用法小结

    Objective-C的内省(Introspection)用法小结

    这篇文章主要介绍了Objective-C的内省(Introspection)用法,这是面向对象语言和环境的一个强大特性,需要的朋友可以参考下
    2014-07-07
  • Qt进程和线程QProcess和QThread的使用

    Qt进程和线程QProcess和QThread的使用

    本文主要介绍了Qt进程和线程QProcess和QThread的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 基于C++实现BMI身体质量指数计算工具

    基于C++实现BMI身体质量指数计算工具

    BMI(Body Mass Index,身体质量指数),也称为体重指数,是一种常用的衡量成人人体肥胖程度的指标,本文就来用C++编写一个简单的BMI计算工具吧
    2023-10-10
  • C++多线程编程时的数据保护

    C++多线程编程时的数据保护

    这篇文章主要介绍了C++多线程编程时的数据保护,作者针对C++11版本中的新特性做出了一些解说,需要的朋友可以参考下
    2015-07-07
  • C++ 程序员为什么看不起php程序员

    C++ 程序员为什么看不起php程序员

    由于当今市场状况,各种培训班飞起,PHPer越来越多,学习成本很低。导致了很多人对PHP的误解。其实PHP学到深入的时候,所需知识很多,并不是表面看到的那样。另外,PHP确实严谨性不高,这个跟C++,java确实都没法比。但是,PHP在web开发中的效率,是其他语言所不能比的
    2017-02-02
  • C++ cin不同状态详细讲解

    C++ cin不同状态详细讲解

    cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream类的对象
    2022-10-10
  • C++二分查找算法实例

    C++二分查找算法实例

    这篇文章主要为大家详细介绍了C++二分查找算法的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  •  C++模板template原理解析

     C++模板template原理解析

    这篇文章主要介绍了C++模板template原理,函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本
    2022-07-07
  • c++实现解析zip文件的示例代码

    c++实现解析zip文件的示例代码

    这篇文章主要为大家详细介绍了如何利用c++实现解析zip文件,并对流式文件pptx内容的修改,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2023-12-12

最新评论