剑指OFFER之二叉树中和为某一值的路径

题目描述:

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

输入:

每个测试案例包括n+1行:

第一行为2个整数n,k(1<=n<=10000),n表示结点的个数,k表示要求的路径和,结点编号从1到n。

接下来有n行。这n行中每行为3个整数vi,leftnode,rightnode,vi表示第i个结点的值,leftnode表示第i个结点的左孩子结点编号,rightnode表示第i个结点的右孩子结点编号,若无结点值为-1。编号为1的结点为根结点。

输出:

对应每个测试案例,先输出“result:”占一行,接下来按字典顺序输出满足条件的所有路径,这些路径由结点编号组成,输出格式参照输出样例。

样例输入:
5 22
10 2 3
5 4 5
12 -1 -1
4 -1 -1
7 -1 -1
1 5
1 -1 -1
样例输出:
result:
A path is found: 1 2 5
A path is found: 1 3
result:

注意:题目要求要按照字典序进行输出,做以下处理:选取值小的结点作为leftnode,值较大的结点作为rightnode.

Code:
#include <cstdio>
#include <vector>
#include <set>

using namespace std;

struct BinaryTreeNode{
    int data;
    int lchild;
    int rchild;
};void findPath(BinaryTreeNode Tree[],int root,int expectedSum,vector<int>& path,int currentSum){
    currentSum+=Tree[root].data;
    path.push_back(root);
    bool isLeaf=Tree[root].lchild==-1&&Tree[root].rchild==-1;
    if(currentSum==expectedSum&&isLeaf){
        printf("A path is found: ");
        vector<int>::iterator iter=path.begin();
        bool isFirst=true;
        for( ;iter!=path.end();++iter){
            if(isFirst){
                printf("%d",*iter);
                isFirst=false;
            }
            else
                printf(" %d",*iter);
        }
        printf("\n");
    }
    if(Tree[root].lchild!=-1){
        findPath(Tree,Tree[root].lchild,expectedSum,path,currentSum);
    }
    if(Tree[root].rchild!=-1){
        findPath(Tree,Tree[root].rchild,expectedSum,path,currentSum);
    }
    path.pop_back();
}

void startFind(BinaryTreeNode Tree[],int root,int expectedSum){
    if(root==-1)
        return;
    vector<int> path;
    int currentSum=0;
    findPath(Tree,root,expectedSum,path,currentSum);
}

int maxNum(int a,int b){
    return a>b?a:b;
}

int minNum(int a,int b){
    return a<b?a:b;
}

int main()
{
    int n,k;
    const int nodeNum=10010;
    BinaryTreeNode Tree[nodeNum];
    while(scanf("%d%d",&n,&k)!=EOF){
        int vi,leftNode,rightNode;
        for(int cnt=1;cnt<=n;++cnt){
            scanf("%d%d%d",&vi,&leftNode,&rightNode);
            Tree[cnt].data=vi;
            Tree[cnt].lchild=minNum(leftNode,rightNode);
            Tree[cnt].rchild=maxNum(leftNode,rightNode);
        }
        printf("result:\n");
        startFind(Tree,1,k);
    }
    return 0;
}

/**************************************************************
    Problem: 1368
    User: lcyvino
    Language: C++
    Result: Accepted
    Time:40 ms
    Memory:1568 kb
****************************************************************/

时间: 2024-10-01 22:41:53

剑指OFFER之二叉树中和为某一值的路径的相关文章

【Java】 剑指offer(34) 二叉树中和为某一值的路径

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 1.假设找到了其中一条路径,达到叶结点后,由于没有指向父结点的指针,所以必须提前创建一个链表存储前面经过的结点. 2.由于是从根结点出发,所以要想到使用前序遍历 3.利用链表存储结点,在该结点完成左右子树的路径搜索后(即递归函数结束,返回

【剑指Offer】二叉树中和为某一值的路径

问题描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 算法分析 如果 root 等于 输入数,将root放在返回数组里返回:如果root大于输入数,返回空值: 如果root小于输入数,将root放在数组里,输入数自减root,一同随root的子树递归: 如果输入数为0了且左右子树都为空,即为叶子节点,则这条路径可行,返回数组: 如果 root 没有子树了,同时输入数还没为0,说明此路不通,返回NUL

python剑指offer系列二叉树中和为某一值的路径

题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数组靠前) # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回二维列

剑指offer:二叉树中和为某一值的路径

题目描述输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数组靠前) class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: # 返回二维列表,内部每个列表表示找到的路径 """ 根据题目

剑指Offer-- 二叉搜索树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 本身题目不是很难,但是因为刚接触pyhon,对一些对象的传递不太了解,所以跳了很久也没有通过,后来看到这篇文章  后才明白,犯了一样的错误 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.ri

LeetCode | 面试题34. 二叉树中和为某一值的路径【剑指Offer】【Python】

LeetCode 面试题34. 二叉树中和为某一值的路径[剑指Offer][Medium][Python][回溯] 问题 力扣 输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点开始往下一直到叶节点所经过的节点形成一条路径. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 返回: [ [5,4,11,2], [5,8,4,5] ] 提示: 节点总数 <= 10000 注意:本题与主站 1

二叉树中和为某一值的路径-剑指Offer

二叉树中和为某一值的路径 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路 用栈来存储二叉树的路径,遍历到叶子结点就判断是否总和为target,是的话打印,若不是叶子结点,那继续遍历左右子树 注意:打印完后返回父结点时要弹出栈顶的叶子结点,并且总和减去该值 注意:打印路径时要遍历栈 代码 import java.util.ArrayList; import java.util.Stack;

【剑指offer】二叉树的镜像

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25915971 题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.C

剑指OFFER之二叉树的镜像(九度OJ1521)

题目描述: 输入一个二叉树,输出其镜像. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000,n代表将要输入的二叉树节点的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩子,紧接着是右孩子的编号.C