博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树的建立与前序、中序和后序遍历(C++)
阅读量:4049 次
发布时间:2019-05-25

本文共 2409 字,大约阅读时间需要 8 分钟。

这两天停更了博客,在停下来学习树。不得不说相比较于链表、栈和队列等,树有更复杂的结构和特性。当然基本思想也离不开前面学的基本结构。比较困难的点就在于如何优雅的实现二叉树的建立和遍历–递归思想。对于刚接触递归的我来说,还是需要多想多练。

本例结合“大话数据结构”中的例题,构建二叉树和用三种方法,实现对树的遍历。我们想创建一个前序为“AB#D##C##”的二叉树,将树中的每个空指针引出一个虚节点,用#表示,该树为扩展二叉树。

代码示例输出:

Enter characters in the preorder traversal:AB#D##C##With PreOrderTraverse:A at 1 level.B at 2 level.D at 3 level.C at 2 level.With InOrderTraverse:B at 2 level.D at 3 level.A at 1 level.C at 2 level.With PostOrderTraverse:D at 3 level.B at 2 level.C at 2 level.A at 1 level.

基本函数功能介绍:

void CreateTreePre(Tree &T);   //创建二叉树void PreOrderTraverse(Tree T, int level);   //前序遍历树void InOrderTraverse(Tree T, int level);   //中序遍历树void PostOrderTraverse(Tree T, int level);   //后续遍历树void operate(ElemType ch, int level);   //遍历过程中执行的操作

需要注意的问题:

在创建树的过程中,注意函数原型为:void CreateTreePre(Tree &T);   //创建二叉树其中形参为引用类型,刚开始时没有用引用,导致虽然在构建二叉树时没有报错,但是在树的遍历的时候,无论如何也读不到值。在对其地址进行输出分析之后,发现问题就在于不是引用,提醒自己以后此类问题勿犯。

完整程序:

#include
#include
using namespace std;typedef char ElemType;struct Node{
ElemType data; Node * lchild; Node * rchild;};typedef Node* Tree;void CreateTreePre(Tree &T);void PreOrderTraverse(Tree T, int level);void InOrderTraverse(Tree T, int level);void PostOrderTraverse(Tree T, int level);void operate(ElemType ch, int level);void main(){
Tree test1 = nullptr; cout << "Enter characters in the preorder traversal: \n"; CreateTreePre(test1); int level = 1; cout << "With PreOrderTraverse: \n"; PreOrderTraverse(test1, level); cout << "With InOrderTraverse: \n"; InOrderTraverse(test1, level); cout << "With PostOrderTraverse: \n"; PostOrderTraverse(test1, level);}void CreateTreePre(Tree &T){
ElemType ch; cin >> ch; if (ch == '#') T = nullptr; else {
T = new Node; T->data = ch; CreateTreePre(T->lchild); CreateTreePre(T->rchild); }}void operate(ElemType ch, int level){
cout << ch << " at " << level << " level.\n";}void PreOrderTraverse(Tree T, int level){
if (T == nullptr) return; operate(T->data, level); PreOrderTraverse(T->lchild, level + 1); PreOrderTraverse(T->rchild, level + 1);}void InOrderTraverse(Tree T, int level){
if (T == nullptr) return; InOrderTraverse(T->lchild, level + 1); operate(T->data, level); InOrderTraverse(T->rchild, level + 1);}void PostOrderTraverse(Tree T, int level){
if (T == nullptr) return; PostOrderTraverse(T->lchild, level + 1); PostOrderTraverse(T->rchild, level + 1); operate(T->data, level);}

转载地址:http://kpyci.baihongyu.com/

你可能感兴趣的文章
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>