【问题标题】:How lo list children of each node in a Binary Search Tree from preorder traversal?如何从前序遍历中列出二叉搜索树中每个节点的子节点?
【发布时间】:2020-07-25 11:44:06
【问题描述】:

给定一个作为 int 向量的前序遍历(例如 {7,4,3,6,5,8,10}),我该如何列出 迭代每个节点的子节点?

Example output
7 - 4 8
4 - 3 6
6 - 5
8 - 10

我让它生成一棵树,然后递归地列出每个孩子,但我只需要使用给定的向量来完成它。有什么想法吗?

我不是要代码,只是一些很酷的想法

【问题讨论】:

  • 注意右子大于父,左子小于
  • 碰巧有一种相当简单的方法来做这种事情。只需拿出一张白纸,用简单的英语句子,一步一步地写下来。完成后,schedule an emergency appointment with your rubber duck。我们不会在这里为其他人编写整个程序,并且总是将此类问题提交给您的橡皮鸭。在您的橡皮鸭批准您提出的行动计划后,只需将您写下的内容直接翻译成 C++。任务完成!
  • 使用std::stack<int>,并使用一些操作堆栈的逻辑遍历列表。不需要递归。

标签: c++ loops binary-search-tree traversal preorder


【解决方案1】:

经过几次尝试,我成功了。对于每个迭代,您必须找到更大和更小的元素,打印它们,并将它们设置为已使用以避免打印来自其他分支的值。

#include<stdio.h>
#include<iostream>

using namespace std;

int main(){
    int preOrder[] = {7,4,3,6,5,8,10};
    int size = sizeof(preOrder)/sizeof(int);
    bool used[size] = {false};
    for(int i = 0; i < size; ++i){
        bool lesserFound = false;
        bool greaterFound = false;
        for(int j = i+1; j < size; ++j){
            if(used[j]==true)
                lesserFound=greaterFound=true;

            if(preOrder[j]<preOrder[i] && lesserFound==false){
                cout << preOrder[i] << " - LeftChild: " << preOrder[j] << endl;
                lesserFound=true;
                used[j]=true;
            }else if(preOrder[j]>preOrder[i] && greaterFound==false){
                cout << preOrder[i] << " - RightChild: " << preOrder[j] << endl;
                greaterFound=true;
                used[j]=true;
            }
        }
    }
}

输出:

7 - LeftChild: 4
7 - RightChild: 8
4 - LeftChild: 3
4 - RightChild: 6
6 - LeftChild: 5
8 - RightChild: 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多