二叉树的路径和为给定数值的所有路径
2013-08-27 11:16
344 查看
//题意:
//输出二叉树的路径和为给定数值的所有路径;
//二叉树路径是从根节点向下一直到叶子节点的所有节点形成的路径。
//思路:
// 1. 采用前序遍历方式访问某一个节点时,我们把节点加到路径上并累加节点值
// 1) 如果该节点为叶子节点并且路劲中累加和恰好为输入的整数值时输出当前路径;
// 2) 如果该节点不是叶子节点,则继续寻找该节点的左孩子或右节点;
// 2. 如果该路径节点已经是叶子节点后则返回父节点,并且当前路径上减去该节点值,保证返回父节点时路径正确。
//输出二叉树的路径和为给定数值的所有路径;
//二叉树路径是从根节点向下一直到叶子节点的所有节点形成的路径。
//思路:
// 1. 采用前序遍历方式访问某一个节点时,我们把节点加到路径上并累加节点值
// 1) 如果该节点为叶子节点并且路劲中累加和恰好为输入的整数值时输出当前路径;
// 2) 如果该节点不是叶子节点,则继续寻找该节点的左孩子或右节点;
// 2. 如果该路径节点已经是叶子节点后则返回父节点,并且当前路径上减去该节点值,保证返回父节点时路径正确。
#include <iostream> #include <vector> using namespace std; int preOrder[] = {1, 2, 4, 5, 7}; int inOrder[] = {4, 2, 5, 1, 7}; typedef struct Node_ { int data; Node_ * left, * right; }Node; vector<int> path; //前序遍历树 void preOrderTree(Node *root) { if(!root) { return; } printf("%d ", root->data); preOrderTree(root->left); preOrderTree(root->right); } //利用前序数组和后续数组重建 Node * Rebuild(Node * &root, int preOrder[], int inOrder[], int n, int pl, int pr, int il, int ir) { int i = 0; for (i = il; i <= ir; ++i) { if (inOrder[i] == preOrder[pl]) { break; } } int k = i - il; if (i > ir) { root = 0; return root; } else { root = new Node(); root->data = inOrder[i]; } root->left = Rebuild(root->left, preOrder, inOrder, n, pl + 1, pl + k, il, i - 1); root->right = Rebuild(root->right, preOrder, inOrder, n, pl + k + 1, pr, i + 1, ir); return root; } //遍历树的路径,输出节点值 void SumTree(Node *root, int & curSum, int sum) { if (!root) { return; } curSum += root->data; path.push_back(root->data); bool isLeaf = (!root->left && !root->right); if (curSum == sum && isLeaf) { vector<int>::iterator iter = path.begin(); while(iter != path.end()) { printf("%d ", *iter); iter++; } printf("\n"); } SumTree(root->left, curSum, sum); SumTree(root->right, curSum, sum); curSum -= root->data; path.pop_back(); } int main() { int n = sizeof(preOrder) / sizeof(preOrder[0]); Node * root = Rebuild(root, preOrder, inOrder, n, 0, n-1, 0, n-1); printf("Pre Order:"); preOrderTree(root); printf("\n"); printf("Path:\n"); int curSum = 0; int sum = 8; path.clear(); SumTree(root, curSum, sum); return 0; }
相关文章推荐
- 程序员面试金典: 9.4树与图 4.9在二叉树中,打印结点数值总和等于给定值的所有路径
- 给定一棵二叉树,和一个数值。求二叉树的路径和等于给定值的所有路径
- 打印二叉树节点数值总和等于某个给定节点的所有路径
- 【二叉树】打印二叉树中结点数值总和等于某个给定值的所有路径
- 找出二叉树中所有累加值为给定值的路径
- 每天一道LeetCode-----找到二叉树所有和为给定值的路径
- 二叉树中找出和为给定值得所有路径
- 【31】给定一个二叉树打印出所有从根结点到叶子结点路径和为 k 的路径
- 【二叉树的递归】04找出二叉树中路径和等于给定值的所有路径【Path Sum II】
- 【31】给定一个二叉树打印出所有从根结点到叶子结点路径和为 k 的路径
- [转]求二叉树中和为给定值的所有路径
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 给定一棵二叉树,二叉树每个节点的值唯一,从根节点开始找出路径上的所有节点的节点值之和等于规定值的路径
- 求二叉树中和为给定值的所有路径
- 给定一棵二叉树,每个结点包含一个值。打印出所有满足以下条件的路径: 路径上结点的值加起来等于给定的一个值。注意:这些路径不必从根结点开始。
- 输出二叉树中路径上结点值之和为给定值的所有路径
- 节点数值总和等于某个给定值的所有路径
- LintCode 二叉树的所有路径
- lintcode(480)——二叉树的所有路径
- 二叉树的所有路径