随笔 - 147  文章 - 5  评论 - 6  阅读 - 81298

4.在二叉树中找出和为某一值的所有路径

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

 

解: 参考打印二叉树中某节点的祖先节点 http://www.cnblogs.com/buxianghe/p/3198662.html

这里还是采用后续非递归遍历的方法,记录在栈中的节点元素的和,当1个节点2次进栈2次出栈时,并且满足从根结点到它的和等于输入的和,并且它是叶子节点时,那么此时栈中元素就是这条路径,打印它

代码: 

复制代码
/*
     参考后续遍历
 */

#include<iostream>
using namespace std;


typedef struct node
{
    int data;
    struct node* left;
    struct node* right;
}Tree;


typedef struct
{
    Tree* point;
    int count;
}Node;

#define MAX 100
typedef struct
{
    Node  data[MAX];
    int top;
}Stack;

Stack* create_stack(void)
{
    Stack* s=new Stack;
    if(s)
        s->top=-1;
    return s;
}
void free_stack(Stack* s)
{
    if(s)
        delete s;
}

bool empty_stack(Stack* s)
{
    if(s->top==-1)
        return true;
    return false;
}

bool full_stack(Stack* s)
{
    if(s->top==MAX-1)
        return true;
    return false;
}


void push_stack(Stack* s,Node value)
{
    if(full_stack(s))    
        return ;
    s->top++;
    (s->data[s->top]).point=value.point;
    (s->data[s->top]).count=value.count;
}

void pop_stack(Stack* s,Node* value)
{
    if(empty_stack(s))
        return ;
    (*value).point=(s->data[s->top]).point;
    (*value).count=(s->data[s->top]).count;
    s->top--;
}

void get_stack(Stack* s,Node* value)
{
    if(empty_stack(s))
        return ;
    (*value).point=(s->data[s->top]).point;
    (*value).count=(s->data[s->top]).count;
}

Tree* create_tree(void)
{
    int data;
    Tree* t=NULL;

    cin>>data;
    if(data==0)
        return NULL;
    else
    {
        t=new Tree;
        t->data=data;
        t->left=create_tree();
        t->right=create_tree();
    }
}

void free_tree(Tree* t)
{
    if(t)
    {
        free_tree(t->left);
        free_tree(t->right);
        delete t;
        t=NULL;
    }
}

void preorder(Tree* t)
{
    if(t)
    {
        preorder(t->left);
        preorder(t->right);
        cout<<t->data<<" ";
    }
}
    

void pre_dopath(Tree* t,int sum)
{
    Tree* p=t;
    Stack *s1,*s2;
    
    Node temp_node;

    s1=create_stack();
    s2=create_stack();

    int stack_sum=0;
    while(p || !empty_stack(s1))
    {
        if(p)
        {
            stack_sum+=p->data;
            temp_node.point=p;
            temp_node.count=0;
            push_stack(s1,temp_node);
            p=p->left;
        }
        else //
        {
            pop_stack(s1,&temp_node);
            p=temp_node.point;
            stack_sum-=p->data;

            if(temp_node.count==0)
            {
                temp_node.count=1;
                push_stack(s1,temp_node);
                stack_sum+=p->data;
                p=p->right;
            }
            else //该出栈了这个元素
            {
                if(p->left==NULL && p->right==NULL && (p->data+stack_sum==sum))
                {
                    cout<<p->data<<" ";
                    while(!empty_stack(s1))
                    {
                        pop_stack(s1,&temp_node);
                        cout<<(temp_node.point)->data<<" ";
                        push_stack(s2,temp_node);
                    }

                    while(!empty_stack(s2))
                    {
                        pop_stack(s2,&temp_node);
                        push_stack(s1,temp_node);
                    }
                    cout<<endl;
                }    
                p=NULL;
            }
                    
        }
    }


    free_stack(s1);
    free_stack(s2);
}

int main(void)
{
    Tree *t=NULL;
    int sum;

    cin>>sum;
    t=create_tree();

    pre_dopath(t,sum);
    
    free_tree(t);
}
复制代码

输入给定的测试树,输入和22,输入是10 5 4 0 0 7 0 0 12 0 0 ,此时打印2条路径(从底往上打印,也可从商往下打印)12 10和7 5 10。

posted on   紫金树下  阅读(328)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示