在二元树中查找和为某一值的所有路径

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

答:二叉树的后序非递归遍历

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

typedef struct _Node
{
    int data;
    struct _Node *left;
    struct _Node *right;
    bool isVisit;         //后序遍历标志(非递归)
    _Node()
    {
        data = 0;
        left = NULL;
        right = NULL;
        isVisit = false;
    }
}Node, *_PNode;

#define MAXSIZE 100

//创建二叉树利用先序创建
/*
                                             10
                                          /     \
                                         5       12
                                        / \       
                                       4   7    
*/
void CreateBitree(_PNode &pNode, fstream &fin)
{
    int dat;
    fin>>dat;
    if(dat==0)
    {
        pNode = NULL;
    }
    else 
    {
        pNode = new Node();
        pNode->data=dat;      
        CreateBitree(pNode->left, fin);      
        CreateBitree(pNode->right, fin);
    }
}

//在二元树中查找和为某一值的所有路径
void FindAllPathInTree(_PNode pRoot, int num)
{
    _PNode pTree = pRoot;
    _PNode s[MAXSIZE];
    int path[MAXSIZE];
    int top = 0;
    int sum = 0;
    while (top > 0 || NULL != pTree)
    {
        while (NULL != pTree)
        {
            s[++top] = pTree;
            path[top] = pTree->data;
            sum += pTree->data;
            if (NULL == pTree->left && NULL == pTree->right && sum == num)
            {
                for (int i = 1; i <= top; i++)
                {
                    cout<<path[i]<<"  ";
                }
                cout<<endl;
            }
        
            pTree = pTree->left;
        }
        if (top > 0)
        {
            pTree = s[top];
            if (pTree->isVisit)
            {
                sum -= path[top];
                top--;
                pTree = NULL;
            }
            else
            {
                pTree->isVisit = true;
                pTree = pTree->right;
            }
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    fstream fin("tree.txt");
    _PNode pRoot = NULL;
    CreateBitree(pRoot, fin);
    FindAllPathInTree(pRoot, 22);
    return 0;
}

运行界面如下:

建造二叉树的tree.txt如下:

10 5 4 0 0 7 0 0 12 0 0 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值