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

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

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

#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 
posted @ 2012-08-24 21:01  venow  阅读(295)  评论(0编辑  收藏  举报