zoukankan      html  css  js  c++  java
  • 在二元树中查找和为某一值的所有路径

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

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

    #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 
  • 相关阅读:
    html设置360兼容/极速模式
    es查询备忘录
    TypeError: __init__() got an unexpected keyword argument 'strict'
    pandas处理csv
    scrapy中cookie处理
    滑动验证码破解(一)
    python 自定义属性访问 __setattr__, __getattr__,__getattribute__, __call__
    数据库的增删改、单表查询
    库的操作,表的操作,数据类型,完整性约束
    Mysql常用命令(二)
  • 原文地址:https://www.cnblogs.com/venow/p/2654351.html
Copyright © 2011-2022 走看看