【数据结构OJ】D : DS二叉树—二叉树构建与遍历

C++代码示例展示了如何创建二叉树结构,以及如何进行先序、中序和后序遍历。输入是二叉树的先序遍历结果,输出是三种遍历方式的结果。
摘要由CSDN通过智能技术生成

Description

给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果。

  A
 /  \
B    D
 \
  C

Input

第一行输入一个整数t,表示有t个二叉树

第二行起输入每个二叉树的先序遍历结果,空树用字符‘#’表示,连续输入t行。

Output

输出每个二叉树的先序遍历、中序遍历和后序遍历结果。

Sample

samplein

2
AB#C##D##
AB##C##

sampleout

ABCD
BCAD
CBDA
ABC
BAC
BCA

AC代码

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

class TreeNode {
public:
    char data;
    TreeNode* LeftChild;
    TreeNode* RightChild;
    TreeNode* parent;
};

class Bitree {
public:
    TreeNode* root;
    int flag;

    Bitree(const string& str) {
        flag = 0;
        int pos = 0;
        root = createTree(str, pos);
    }

    TreeNode* createTree(const string& str, int& pos) {
        if (pos >= str.length()) {
            return nullptr;
        }
        char ch = str[pos++];
        if (ch == '#') {
            return nullptr;
        }
        else {
            TreeNode* b = new TreeNode();
            b->data = ch;
            b->LeftChild = createTree(str, pos);
            if (b->LeftChild != nullptr) {
                b->LeftChild->parent = b;
            }
            b->RightChild = createTree(str, pos);
            if (b->RightChild != nullptr) {
                b->RightChild->parent = b;
            }
            return b;
        }
    }

    void getLchildLeaf(TreeNode* b) {
        if (b != nullptr && b->parent != nullptr && b->parent->LeftChild == b) {
            if (b->LeftChild == nullptr && b->RightChild == nullptr) {
                flag++;
            }
        }
        if (b->LeftChild != nullptr) {
            getLchildLeaf(b->LeftChild);
        }
        if (b->RightChild != nullptr) {
            getLchildLeaf(b->RightChild);
        }
    }

    void preorderTraversal(TreeNode* root) {//先序输出函数
        if (root == nullptr) {
            return;
        }

        cout << root->data;// << " "; // 输出根节点

        preorderTraversal(root->LeftChild); // 先序遍历左子树

        preorderTraversal(root->RightChild); // 先序遍历右子树
    }


    void inorderTraversal(TreeNode* root) {//中序输出函数
        if (root == nullptr) {
            return;
        }
        inorderTraversal(root->LeftChild); // 中序遍历左子树

        cout << root->data;// << " "; // 输出根节点

        inorderTraversal(root->RightChild); // 中序遍历右子树
    }

    void postorderTraversal(TreeNode* root) {//后序输出函数
        if (root == nullptr) {
            return;
        }

        postorderTraversal(root->LeftChild); // 后序遍历左子树

        postorderTraversal(root->RightChild); // 后序遍历右子树

        cout << root->data; //<< " "; // 输出根节点
    }

};

int main() {
    int t;
    cin >> t;
    while (t--) {
        string str;
        cin >> str;
        Bitree bt(str);
        bt.preorderTraversal(bt.root);
        cout <<endl;
        bt.inorderTraversal(bt.root);
        cout << endl;
        bt.postorderTraversal(bt.root);
        cout << endl;
    }
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值