超详细解析!共2358字纯纯干货 C++&Python程序:输入前序遍历中序遍历求后续遍历 免费复制不要版权 干货满满用处极大 素材可转载请标明出处

二叉树是一种数据结构,其中每个节点最多有两个子节点,通常被称为左子节点和右子节点。二叉树在计算机科学中被广泛应用,包括排序和搜索算法,数据库系统,编程语言解析等等。

在二叉树中,有几种特殊的节点:

根节点:这是二叉树的开始,没有父节点。


内部节点:这些节点有且至少一个子节点。


叶子节点:这些节点没有子节点。这些节点通常是二叉树的最底层。


全二叉树:在二叉树中,从根节点到每个叶子节点的路径上,节点数量相同的路径被称为全路径。全二叉树是指,除了全路径外,其他路径长度都不足的二叉树。


二叉搜索树:这是一种特殊的二叉树,对于每个节点,其左子树中的所有元素都小于该节点,右子树中的所有元素都大于该节点。

二叉树有许多应用,包括:

排序:二叉搜索树可以用于插入排序,删除排序等操作。


搜索:二叉搜索树的搜索效率通常比线性搜索快。


表达式解析:二叉树可以用于表示和解析复杂的算术或布尔表达式。


文件系统:现代计算机文件系统(如NTFS和HFS)在内部使用了一种形式的二叉树来组织和访问文件。

在编程中,通常使用指针来表示二叉树的节点,以及它们的左右子节点。在二叉树的遍历中,有三种基本方法:前序遍历(先访问节点本身,然后访问其子节点),中序遍历(先访问左子节点,然后访问节点本身,最后访问右子节点),和后序遍历(先访问左子节点,然后访问右子节点,最后访问节点本身)。

那么问题来了,我们怎么能使用C++或者Python程序实现输入前序遍历中序遍历,求后序遍历,以及输入中序遍历和后序遍历,求前序遍历呢?

C++ 前序中序求后序

#include<iostream>
#include<vector>
using namespace std;
vector<int> postorderFromPreAndIn(vector<int>& pre, vector<int>& in) {
    int root = pre[0];
    int left = 0;
    for(int i=0; i<in.size(); i++) {
        if(in[i] == root) {
            left = i+1;
            break;
        }
    }
    vector<int> right(in.begin()+left, in.end());
    vector<int> left(in.begin(), in.begin()+left);
    vector<int> postorderLeft = postorderFromPreAndIn(pre.begin()+1, left);
    vector<int> postorderRight = postorderFromPreAndIn(pre.begin()+1+left, right);
    postorderLeft.insert(postorderLeft.end(), postorderRight.begin(), postorderRight.end());
    postorderLeft.push_back(root);
    return postorderLeft;
}
int main() {
    int n;
    cin >> n;
    vector<int> pre(n), in(n), postorder(n);
    for(int i=0; i<n; i++) cin >> pre[i];
    for(int i=0; i<n; i++) cin >> in[i];
    postorder = postorderFromPreAndIn(pre, in);
    for(int i=0; i<n; i++) cout << postorder[i] << " ";
    return 0;
}

Python 输入输出和上面的一样

class BiTreeNode:
    def __init__(self, data):
        self.data = data
        self.lchild = None
        self.rchild = None


class SolvedPostOrder:
    def __init__(self, pre_order, in_order):
        self.pre_order = pre_order
        self.in_order = in_order

    def soled_post_order(self, pre_order, in_order):
        if not pre_order:
            return None
        else:
            root = BiTreeNode(pre_order[0])
            in_order_root_pos = in_order.index(pre_order[0])
            root.lchild = self.soled_post_order(pre_order[1:in_order_root_pos+1], in_order[0:in_order_root_pos])
            root.rchild = self.soled_post_order(pre_order[in_order_root_pos+1:], in_order[in_order_root_pos+1:])
            return root

    def post_order(self, root):
        # 后序排列
        if root:
            self.post_order(root.lchild)
            self.post_order(root.rchild)
            print(root.data, end='')

    def __call__(self):
        root = self.soled_post_order(self.pre_order, self.in_order)
        self.post_order(root)

while True:
    pre_order = input()
    in_order = input()
    # pre_order = 'ABCDEFG'
    # in_order = 'DCBAEFG'
    post_order = SolvedPostOrder(pre_order, in_order)
    post_order()
    print()

不给个关注??谢谢!富豪们请打赏吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彩虹里的小吉祥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值