1. 程式人生 > >建立二叉排序樹_三種順序遍歷

建立二叉排序樹_三種順序遍歷

str 空格 -- 一行 amp oot std new clu

題目描述

輸入一系列整數,建立二叉排序樹,並進行前序,中序,後序遍歷。

輸入描述:

輸入第一行包括一個整數n(1<=n<=100)。
接下來的一行包括n個整數。

輸出描述:

可能有多組測試數據,對於每組數據,將題目所給數據建立一個二叉排序樹,並對二叉排序樹進行前序、中序和後序遍歷。
每種遍歷結果輸出一行。每行最後一個數據之後有一個空格。

輸入中可能有重復元素,但是輸出的二叉樹遍歷序列中重復元素不用輸出。

分析

編寫insert函數

#include <iostream>
using namespace std;

struct tree_node{
    int data;
    tree_node *left;
    tree_node *right;

    tree_node(int x):data(x), left(NULL), right(NULL){} //初始化一個結點
};


void insert(int x, tree_node *root){
    if(x == root -> data) return;
    if(x < root -> data){
        if(!root -> left)//如果左邊為空
            root -> left = new tree_node(x);//則以x建立一個結點,並且插入左邊
        else
            insert(x, root -> left);否則,左邊不空,遞歸插入左子樹
    }else{
        if(!root -> right)// 右子樹為空
            root -> right = new tree_node(x);// 直接插入右邊
        else
            insert(x, root -> right);// 否則遞歸插入右子樹
    }
}


void pre_order(tree_node *root){
    if(!root) return; // 樹為空 直接返回
    cout << root -> data << " ";//先序遍歷,先輸出根節點
    pre_order(root -> left); //遞歸遍歷左子樹
    pre_order(root -> right);// 遞歸遍歷右子樹
}

void in_order(tree_node *root){
    if(!root) return;
    in_order(root -> left);
    cout << root -> data << " ";
    in_order(root -> right);
}

void post_order(tree_node *root){
    if(!root) return;
    post_order(root -> left);
    post_order(root -> right);
    cout << root -> data << " ";
}

int main(){
    int n;
    while(cin >> n){
        int x;
        cin >> x;
        tree_node root(x);
        --n;
        while(n--){
            cin >> x;
            insert(x, &root);
        }
        pre_order(&root); cout << endl;
        in_order(&root); cout << endl;
        post_order(&root);cout << endl;
    }
    return 0;
}

建立二叉排序樹_三種順序遍歷