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


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

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

    #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 
  • 相关阅读:
    js绑定事件方法:addEventListener的兼容问题
    jQuery中$(function(){})与(function($){})(jQuery)、$(document).ready(function(){})等的区别讲解
    jQuery事件绑定函数:on()与bind()的差别
    click事件的累加绑定
    HTML标签marquee实现滚动效果
    原生js添加类名,删除类名
    CSS相邻兄弟选择器
    视差滚动
    纯js实现分页
    下拉加载更多内容(滚动加载)
  • 原文地址:https://www.cnblogs.com/venow/p/2654351.html
Copyright © 2020-2023  润新知