首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释左子遍历右兄弟遍历

解释左子遍历右兄弟遍历
EN

Stack Overflow用户
提问于 2020-03-27 01:26:15
回答 1查看 577关注 0票数 0

我有一个左子右兄弟,如下所示:

代码语言:javascript
复制
    10 
*    | 
*    2 -> 3 -> 4 -> 5 
*              |    | 
*              6    7 -> 8 -> 9  */

我想从根节点遍历到最后一个节点,遍历函数如下:

代码语言:javascript
复制
void traverseTree(Node * root) 
{ 
    if (root == NULL) 
        return; 

    while (root) 
    { 
        cout << " " << root->data; 
        if (root->child) 
            traverseTree(root->child); 
        root = root->next; 
    } 
} 

据我所知,如果节点有一个子节点,那么指针指向它的子节点,否则指向兄弟节点(下一个)。在这种情况下,当指针指向元素6时,它将转到root->next元素(为NULL)。但是,该函数仍然可以打印剩余的元素(5,7,8,9)。谁能帮我解释一下traverseTree是如何工作的?

下面是重新创建树的代码:

代码语言:javascript
复制
// CPP program to create a tree with left child 
// right sibling representation. 
#include<bits/stdc++.h> 
using namespace std; 

struct Node 
{ 
    int data; 
    struct Node *next; 
    struct Node *child; 
}; 

// Creating new Node 
Node* newNode(int data) 
{ 
    Node *newNode = new Node; 
    newNode->next = newNode->child = NULL; 
    newNode->data = data; 
    return newNode; 
} 

// Adds a sibling to a list with starting with n 
Node *addSibling(Node *n, int data) 
{ 
    if (n == NULL) 
        return NULL; 

    while (n->next) 
        n = n->next; 

    return (n->next = newNode(data)); 
} 

// Add child Node to a Node 
Node *addChild(Node * n, int data) 
{ 
    if (n == NULL) 
        return NULL; 

    // Check if child list is not empty. 
    if (n->child) 
        return addSibling(n->child, data); 
    else
        return (n->child = newNode(data)); 
} 

// Traverses tree in level order 
void traverseTree(Node * root) 
{ 
    if (root == NULL) 
        return; 

    while (root) 
    { 
        cout << " " << root->data; 
        if (root->child) 
            traverseTree(root->child); 
        root = root->next; 
    } 
} 

//Driver code 

int main() 
{ 
    Node *root = newNode(10); 
    Node *n1 = addChild(root, 2); 
    Node *n2 = addChild(root, 3); 
    Node *n3 = addChild(root, 4); 
    Node *n4 = addChild(n3, 6); 
    Node *n5 = addChild(root, 5); 
    Node *n6 = addChild(n5, 7); 
    Node *n7 = addChild(n5, 8); 
    Node *n8 = addChild(n5, 9); 
    traverseTree(root); 
    return 0; 
} 
EN

回答 1

Stack Overflow用户

发布于 2020-03-27 01:34:04

在执行traverseTree(root->child)之后,控制流将从下一行继续。你不是从这个函数中返回,只是从这个函数中调用另一个函数。

代码语言:javascript
复制
void traverseTree(Node * root) 
{ 
    if (root == NULL) 
        return; 

    while (root) 
    { 
        cout << " " << root->data; 
        if (root->child) 
            traverseTree(root->child); // First, if child exists, traverse child. No return statement following here.
        root = root->next; // Next, traverse sibling
    } 
} 

如果您仍然有疑问,那么在调用函数时阅读有关程序流的内容会对您有所帮助。

更新(与问题完全无关):OP,solution using stack请求的

代码语言:javascript
复制
void traverseTree(Node * root) 
{ 
    if (root == NULL) 
        return; 
    stack<Node*> s;
    s.push(root);
    while (!s.empty())
    {
        Node* top = s.top();
        cout << " " << top->data;
        s.pop();
        if (top->next) s.push(top->next);
        if (top->child) s.push(top->child);
    }
} 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60872860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档