二叉树是一种数据结构,其中每个节点最多有两个子节点,通常被称为左子节点和右子节点。二叉树在计算机科学中被广泛应用,包括排序和搜索算法,数据库系统,编程语言解析等等。
在二叉树中,有几种特殊的节点:
根节点:这是二叉树的开始,没有父节点。
内部节点:这些节点有且至少一个子节点。
叶子节点:这些节点没有子节点。这些节点通常是二叉树的最底层。
全二叉树:在二叉树中,从根节点到每个叶子节点的路径上,节点数量相同的路径被称为全路径。全二叉树是指,除了全路径外,其他路径长度都不足的二叉树。
二叉搜索树:这是一种特殊的二叉树,对于每个节点,其左子树中的所有元素都小于该节点,右子树中的所有元素都大于该节点。
二叉树有许多应用,包括:
排序:二叉搜索树可以用于插入排序,删除排序等操作。
搜索:二叉搜索树的搜索效率通常比线性搜索快。
表达式解析:二叉树可以用于表示和解析复杂的算术或布尔表达式。
文件系统:现代计算机文件系统(如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()
不给个关注??谢谢!富豪们请打赏吧!