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

从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。
例如 输入整数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
{
 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++
二叉树
二叉树查找算法、二叉树查找、二叉树查找节点、二叉树平均查找长度、二叉树查找时间复杂度,以便于您获取更多的相关知识。

时间: 2024-11-03 21:36:46

C++实现查找二叉树中和为某一值的所有路径的示例_C 语言的相关文章

[程序员面试题精选100题]4.二叉树中和为某一值的所有路径

[题目] 输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径. 打印出和与输入整数相等的所有路径. 例如输入整数22和如下二元树                                             10                                            /   \                                           5     12                   

C语言实现找出二叉树中某个值的所有路径的方法_C 语言

本文实例讲述了C语言实现找出二叉树中某个值的所有路径的方法,是非常常用的一个实用算法技巧.分享给大家供大家参考. 具体实现方法如下: #include <iostream> #include <vector> #include <iterator> #include <algorithm> using namespace std; vector<int> result; struct Node { Node(int i = 0, Node *pl

深入遍历二叉树的各种操作详解(非递归遍历)_C 语言

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组队列,分别使用了front和rear两个数组的下标来表示入队与出队,还有两个操作就是求二叉树的深度.结点数... 复制代码 代码如下: #include<iostream>#include<queue>#include<stack>using namespace std;/

C++之BOOST字符串查找示例_C 语言

本文实例讲述了C++中BOOST字符串查找的方法,分享给大家供大家参考.具体方法如下: BOOST  字符串查找示例 复制代码 代码如下: #include <string>  #include <iostream>  #include <algorithm>  #include <functional>  #include <boost/algorithm/string/case_conv.hpp>  #include <boost/al

二分查找算法在C/C++程序中的应用示例_C 语言

 二分查找算法的思想很简单,<编程珠玑>中的描述: 在一个包含t的数组内,二分查找通过对范围的跟综来解决问题.开始时,范围就是整个数组.通过将范围中间的元素与t比较并丢弃一半范围,范围就被缩小.这个过程一直持续,直到在t被发现,或者那个能够包含t的范围已成为空.         Donald Knuth在他的<Sorting and Searching>一书中指出,尽管第一个二分查找算法早在1946年就被发表,但第一个没有bug的二分查找算法却是在12年后才被发表出来.其中常见的一

c语言-C语言算法实现查找二叉树最短路径的问题

问题描述 C语言算法实现查找二叉树最短路径的问题 解决方案 http://www.cnblogs.com/nick-pan/articles/2613136.html 解决方案二: Dantjig算法求最短路径的c语言实现关于最短路径图算法实现的问题

【算法与数据结构】查找二叉树的实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.题目介绍     二叉树是一种基本的数据结构.查找二叉树是一种方便与查找,删除,插入等功能的二叉树,它要求每个父节点的左分支小于父节点,右分支大于父节点.下面我们来实现下面这个查找二叉树. 2.java代码实现 public class BinaryTree { private Node root; public BinaryTree(){ root=null; } /* * 定义内部节点 */ publ

C++二叉树结构的建立与基本操作_C 语言

准备数据定义二叉树结构操作中需要用到的变量及数据等. 复制代码 代码如下: #define MAXLEN 20    //最大长度typedef char DATA;    //定义元素类型struct  CBTType                   //定义二叉树结点类型 { DATA data;           //元素数据  CBTType * left;    //左子树结点指针  CBTType * right;   //右子树结点指针 }; 定义二叉树结构数据元素的类型DA

一波C语言二元查找树算法题目解答实例汇总_C 语言

按层次遍历二元树问题描述:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印.  例如输入: 8 / / 6 10 / / / / 5 7 9 11 输出 8 6 10 5 7 9 11           定义二元树(其实是二元搜索树,但并不遍历算法)的结点为: struct BSTreeNode { int value; BSTreeNode *left; BSTreeNode *right; };       思路:利用队列的先进先出,很容易实现.每次取出队列的首