二叉树中的和,求路径

题目描述:已知二叉树和一个确定的值,求二叉树中的路径上节点的和满足给定的值,输出这些路径。

题目和算法解析:我们知道二叉树中的路径是指从根节点到叶子节点的。一定是从根节点出发的。所以我们需要有一种数据结构能够记录我们走过的路径。想到了栈。算法需要从根节点开始采用  前序遍历的思想逐个去校验是否符合条件。

算法实现;

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4
 5 typedef struct BiTreeNode{
 6     int data;
 7     struct BiTreeNode *left;
 8     struct BiTreeNode *right;
 9 }BiTreeNode;
10
11 void FindPathCore(BiTreeNode *pHead, int sum, vector<int>& path, int currentSum){
12     currentSum += pHead->data;
13     path.push_back(pHead->data);
14
15     //如果是叶子节点,并且路径上的节点的等于输入的值,打印这条路径
16     bool isLeaf = pHead->left == NULL && pHead->right == NULL;
17     if(currentSum == sum && isLeaf){
18         cout<<"The path is: ";
19         vector<int>::iterator iter = path.begin();
20         for(; iter != path.end(); ++iter){
21             cout<<*iter<<‘ ‘;
22         }
23
24         cout<<endl;
25     }
26
27     //如果不是叶子节点,需要遍历它的子节点
28     if(currentSum < sum && pHead->left != NULL){             //如果当前的和已经大于期望的和,那么久不需要再向下寻找了
29         FindPathCore(pHead->left, sum, path, currentSum);
30     }
31     if(currentSum < sum && pHead->right != NULL){
32         FindPathCore(pHead->right, sum, path, currentSum);
33     }
34     //返回父节点之前,在路径上删除当前节点
35     path.pop_back();
36 }
37
38 void FindPath(BiTreeNode *pHead, int sum){
39     if(pHead == NULL){
40         return ;
41     }
42
43     vector<int> path;
44     int currentSum = 0;
45     FindPathCore(pHead, sum, path, currentSum);
46 }
47
48 BiTreeNode *createTree(){           //前序遍历的方法创建一棵二叉树
49     int item;
50     BiTreeNode *pNode = NULL;
51     cin>>item;
52
53     if(item != -1){
54         BiTreeNode *tmp = new BiTreeNode();
55         pNode = tmp;
56         tmp->data = item;
57
58         pNode->left = createTree();
59         pNode->right = createTree();
60
61         return pNode;
62     }
63     else{
64         pNode = NULL;
65         return pNode;
66     }
67 }
68
69 int main(){                      //测试方法
70     BiTreeNode *test = createTree();
71     FindPath(test, 22);
72     return 0;
73 } 

实现效果;

时间: 2024-12-18 18:03:40

二叉树中的和,求路径的相关文章

3.8 求二叉树中节点的最大距离

题目: 把二叉树看成一个图,父子节点之间的连线看成是双向的,定义"距离"为两个节点之间的边数. 求一颗二叉树中的两个节点之间的距离的最大值. 方法一:用书上写的方法: 代码: struct node { node *left; node *right; int nMaxLeft; int nMaxRight; char ch; }; int nMaxLength = 0; void FindMaxDistance(node *root) { if(root == NULL) retur

求二叉树中任意两个结点的距离

求二叉树中任意两个结点的距离 实现步骤: 计算跟到第一个结点的距离: 计算跟到第二个结点的距离: 计算lca: 计算跟到lca结点的距离: 结果为(1) + (2) - 2 * (4),因为重复计算了两次的从跟到lca结点的距离: 1 class Node(object): def __init__(self, value=0): self.value = value self.left = self.right = None def get_path_length(root, n, path)

【算法题目】求二叉树中节点的最大距离

如果我们把二叉树视为一个图,父子节点之间的连线视为双向的,我们姑且定义为“举例”为两节点之间边的个数.写一个程序求一颗二叉树中相距最远的两个节点之间的距离(<编程之美>3.8) 思路:如果两个节点相距最远,一定是两个叶子节点,或者是一个叶子节点到它的根节点. 根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论.    对于任意一个节点,以该节点为根,假设这个根youk个孩子节点,那么相距最远的两个节点U和V之间的路径与这个根节点的关系有两种情况. 1.若路径经过根Root,则U和

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \         /   \ n6    n7    n8    n9 /                       / n10                

求二叉树中两个节点的最远距离

问题定义 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 计算一个二叉树的最大距离有两个情况: 情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 思路: 1,后序遍历每一节点,找出该节点到最右边的距离以及最左边的距离: 2,找到之和最大的即可. //需保存左子树中最长距离.右子树最长

编程之美之求二叉树中节点的最大距离

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 分析:树上分析的很清楚,计算一个二叉树的最大距离有两个情况: 1. 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 2. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 但是树上的代码使用了额外的节点字段,这里给出我的代码,思路是一样的: struct BinaryTree { int valu

编程之美3.8 求二叉树中节点的最大距离

描述:如果把二叉树看成一个图,父子节点之间的连线看成双向的,定义“距离”为两个节点之间边的个数.求二叉树中相距最远的两个节点的距离. 思路:相距最远的两个节点一定是叶子节点,且这两个叶子节点的路径有两种情况: 1. 该路径经过root节点,则两个叶子节点分属root.left和root.right为根的子树,而且是两个子树中距离root.left和root.right最远的叶子节点: 2. 该路径不经过root节点,则这两个叶子节点的root.left或root.right上: 根据以上分析,参

11求二叉树中节点的最大距离

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253605.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:如果我们把二叉树看成一个图,一棵树显示是一颗有向无环图,定义"距离"为两节点之间边的个数(不考虑方向).写一个程序,求一棵二叉树中相距最远的两个节点