排序二叉树(c++)

排序二叉树是一棵有顺序,且没有重复元素的二叉树。

对每个节点而言:

如果左子树不为空,则左子树上的所有节点的权值都小于该节点的权值。
如果右子树不为空,则右子树上的所有节点的权值都大于该节点的权值。

上图为一棵排序二叉树。相信你已经发现,将排序二叉树上的节点的权值按照中序遍历顺序排列成的序列,一定是严格单调递增的。

下面我们来讲一下如何构造一棵排序二叉树,我们主要运用 DFS 的方法。

算法思想:

假定我们要将数值 X 插入二叉树中。

  1. 判断当前节点是否为空节点,若为空,则将 X 插入到该节点处。
  2. 若不为空,比较当前节点的权值与 X 的大小。
  3. X 小于当前节点的值,进入当前节点的左子树。
  4. X 大于当前节点的值,进入当前节点的右子树。
  5. 重复 1,2,3,4 步。
#include<bits/stdc++.h>
using namespace std;

int tree[1010], pos[1010];
void dfs(int &root, int x) {
    if(tree[root] == -1){
        tree[root] = x;
        return ;
    }
    if (x < tree[root]){
        root *= 2;;
        dfs(root, x);
    } else if (x > tree[root]){
        root *= 2;
        root++;
        dfs(root, x);
    }
}
int main() {
    int n;
    cin >> n;
    memset(tree, -1, sizeof(tree));
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        pos[i] = 1;
        dfs(pos[i], x);
    }
    for (int i = 1; i <= n; i++) {
        cout << tree[pos[i]] << ' ' << tree[pos[i] * 2] << ' ' << tree[pos[i] * 2 + 1] << endl;
    }
    return 0;
}

  

相关推荐

  1. c++

    2024-07-22 22:18:04       56 阅读
  2. c#

    2024-07-22 22:18:04       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 22:18:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 22:18:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 22:18:04       45 阅读
  4. Python语言-面向对象

    2024-07-22 22:18:04       55 阅读

热门阅读

  1. Math Reference Notes: 数学思想和方法

    2024-07-22 22:18:04       13 阅读
  2. Flask: URL 视图函数 路由

    2024-07-22 22:18:04       16 阅读
  3. web前端 React 框架面试200题(四)

    2024-07-22 22:18:04       14 阅读
  4. Redis 持久化详解

    2024-07-22 22:18:04       15 阅读
  5. 设计模式-抽象工厂模式

    2024-07-22 22:18:04       11 阅读