打印所有根到叶路径

Posted

技术标签:

【中文标题】打印所有根到叶路径【英文标题】:Printing all root to leaf paths 【发布时间】:2015-07-02 12:06:26 【问题描述】:

我尝试在二叉树中的代码。

#include<iostream>
#include<stack>
using namespace std;

bool visited[100];
void intilize()
    for(int i=0;i<100;i++)
      visited[i]=false;

struct node

    int data;
    struct node *left,*right;
;
struct node* createNode(int k)

    struct node* temp = new node;
    temp->left = NULL;
    temp->right = NULL;
    temp->data = k;
    return temp;

stack<node*> s,s1;
void print()
    while(!s.empty())
        s1.push(s.top());
        s.pop();
    
    while(!s1.empty())
        struct node* a= s1.top();
        cout<<a->data<<" ";
        s1.pop();
        s.push(a);
        if(s1.empty())
        return;

    



void printpath(struct node* node)
    if(node==NULL) return;
    s.push(node);

    while(!s.empty())
    struct node* top=s.top();
    visited[top->data]=true;

    if(top->left!=NULL&&visited[top->left->data]==false)
     printpath(top->left);
    else if(top->right!=NULL&&visited[top->right->data]==false)
     printpath(top->right);
    else if(top->left==NULL&&top->right==NULL)
    print();
     cout<<"\n";    
    

     s.pop();   
    




int main() 
    struct node* root = createNode(50);
    root->left = createNode(7);
    root->right = createNode(2);

    root->right->left = createNode(1);
    root->right->right = createNode(30);
    root->right->right->right = createNode(40);
    root->right->left->left = createNode(10);
    root->right->left->left->left = createNode(12);

    intilize();
    printpath(root);

    return 0;

代码给出了分段错误,因为终止条件存在一些问题。 有人可以帮我找出问题所在。

【问题讨论】:

【参考方案1】:

这种方法过于复杂且脆弱。

为此不需要单独的堆栈。

为此不需要单独的“可见”数组。

所需要的只是一个递归地下降到这棵树的股票递归访问者,它还为在堆栈上动态构建的结构提供一个附加参数,该结构使用一个链接列表动态构建到根的路径是这样的:

struct path_to_root 
   struct path_to_root *next;
   struct node *n;
;

现在,打印每个叶子笔记的路径所需的只是一个沼泽标准访问者,它递归地遍历树,以及这个附加参数。以下是一般方法的粗略想法:

void printpath(struct node *n, struct path_to_root *p)

   struct path_to_root pnext;

   if (!n)
       return;

   if (!n->left && !n->right)
   
       /* Your homework assignment here is to print the path that's in "p" */
   

   pnext.n=n;
   pnext.next=p;

   printpath(n->left, &pnext);
   printpath(n->right, &pnext);

这将被调用为:

printpath(root, NULL);

如前所述,您的家庭作业是使用p 参数在指示的空间中实现打印叶子路径的实际代码。此时,叶子的路径将在p 参数中找到。

现在,这里有一个棘手的部分是 p 将是叶子的父级,p-&gt;next 将是它的祖父级,依此类推。所以路径是从下到上,不是从上到下,但这是一个小细节,可以在打印代码中处理。

或者,或者,以相同的方式从上到下动态构建到叶子的路径不会有太多额外的工作。

【讨论】:

以上是关于打印所有根到叶路径的主要内容,如果未能解决你的问题,请参考以下文章

给定一棵二叉树,找到所有从根到叶的路径

c_cpp 给定二叉树和求和,找到所有根到叶路径,其中每个路径的总和等于给定的总和

1080. 根到叶路径上的不足节点

c_cpp 给定二叉树和总和,确定树是否具有根到叶路径,以便沿路径添加所有值等于gi

打印n叉树python的所有路径

LeetCode 1022.从根到叶的二进制数之和