二叉树遍历及C语言实现
已知中序和前序序列,或者已知中序和后序序列,都能够构造一棵二叉树。在本例中,本人用C语言写程序解答了下面两个算法题:
(1)给出一棵二叉树的中序与后序遍历序列,求出它的先序遍历序列。
(2)给出一棵二叉树的中序与先序遍历序列,求出它的后序遍历序列。
知识点扼要回顾:
所谓二叉树的遍历,是指按一定的顺序对二叉树中的每个结点均访问一次,且仅访问一。按照根结点访问位置的不同,通常把二叉树的遍历分为六种:
TLR(根左右), TRL(根右左), LTR(左根右)
RTL(右根左), LRT(左右根), RLT(右左根)
其中,TRL、RTL和RLT三种顺序在左右子树之间均是先右子树后左子树,这与人们先左后右的习惯不同,因此,往往不予采用。余下的三种顺序TLR、LTR和LRT根据根访问的位置不同分别被称为前序遍历、中序遍历和后序遍历。
前序遍历的规律是:输出根结点,输出左子树,输出右子树;
中序遍历的规律是:输出左子树,输出根结点,输出右子树;
后序遍历的规律是:输出左子树,输出右子树,输出根结点;
不多说了,看代码吧:)
- #include <iostream>
- #include <string>
-
- using namespace std;
-
-
- typedef char DATA_TYPE;
-
- typedef struct tagBINARY_TREE_NODE BINARY_TREE_NODE, *LPBINARY_TREE_NODE;
-
- struct tagBINARY_TREE_NODE
- {
- DATA_TYPE data;
- LPBINARY_TREE_NODE pLeftChild;
- LPBINARY_TREE_NODE pRightChild;
- };
-
-
-
-
-
-
-
-
-
-
- void TreeFromMidPost(LPBINARY_TREE_NODE & lpNode, string mid, string post, int lm, int rm, int lp, int rp)
- {
-
- lpNode = new BINARY_TREE_NODE;
- lpNode->data = post[rp];
- lpNode->pLeftChild = NULL;
- lpNode->pRightChild = NULL;
-
- int pos = lm;
-
- while (mid[pos] != post[rp])
- {
- pos++;
- }
- int iLeftChildLen = pos - lm;
-
- if (pos > lm)
- {
- TreeFromMidPost(lpNode->pLeftChild, mid, post, lm, pos - 1, lp, lp + iLeftChildLen - 1);
- }
-
- if (pos < rm)
- {
- TreeFromMidPost(lpNode->pRightChild, mid, post, pos + 1, rm, lp + iLeftChildLen, rp - 1);
- }
- }
-
-
-
-
-
-
-
-
-
-
- void TreeFromMidPre(LPBINARY_TREE_NODE & lpNode, string mid, string pre, int lm, int rm, int lp, int rp)
- {
-
- lpNode = new BINARY_TREE_NODE;
- lpNode->data = pre[lp];
- lpNode->pLeftChild = NULL;
- lpNode->pRightChild = NULL;
-
- int pos = lm;
-
- while (mid[pos] != pre[lp])
- {
- pos++;
- }
- int iLeftChildLen = pos - lm;
-
- if (pos > lm)
- {
- TreeFromMidPre(lpNode->pLeftChild, mid, pre, lm, pos - 1, lp + 1, lp + iLeftChildLen);
- }
-
- if (pos < rm)
- {
- TreeFromMidPre(lpNode->pRightChild, mid, pre, pos + 1, rm, lp + iLeftChildLen + 1, rp);
- }
- }
-
-
- void PreOrder(LPBINARY_TREE_NODE p)
- {
- if(p != NULL)
- {
- cout << p->data;
- PreOrder(p->pLeftChild);
- PreOrder(p->pRightChild);
- }
- }
-
-
- void MidOrder(LPBINARY_TREE_NODE p)
- {
- if(p != NULL)
- {
- MidOrder(p->pLeftChild);
- cout << p->data;
- MidOrder(p->pRightChild);
- }
- }
-
-
- void PostOrder(LPBINARY_TREE_NODE p)
- {
- if(p != NULL)
- {
- PostOrder(p->pLeftChild);
- PostOrder(p->pRightChild);
- cout << p->data;
- }
- }
-
-
- void Release(LPBINARY_TREE_NODE lpNode)
- {
- if(lpNode != NULL)
- {
- Release(lpNode->pLeftChild);
- Release(lpNode->pRightChild);
- delete lpNode;
- lpNode = NULL;
- }
- }
-
-
- int main(int argc, char* argv[])
- {
- string pre;
- string mid;
- string post;
-
- LPBINARY_TREE_NODE lpRoot;
-
-
- cout<<"程序1已知二叉树的中序与后序序列,求先序序列"<<endl;
- cout<<"请先输入中序序列,回车后输入后序序列:"<<endl;
-
- cin >> mid;
- cin >> post;
-
- TreeFromMidPost(lpRoot, mid, post, 0, mid.size()-1, 0, post.size()-1);
- cout<<"先序遍历结果:";
- PreOrder(lpRoot);
- cout<<endl;
-
- cout<<"中序遍历结果:";
- MidOrder(lpRoot);
- cout<<endl;
-
- cout<<"后序遍历结果:";
- PostOrder(lpRoot);
- cout<<endl;
- Release(lpRoot);
- cout<<endl;
-
- cout<<"程序2已知二叉树的中序与先序序列,求后序序列"<<endl;
- cout<<"请先输入先序序列,回车后输入中序序列:"<<endl;
- cin >> pre;
- cin >> mid;
-
- TreeFromMidPre(lpRoot, mid, pre, 0, mid.size()-1, 0, pre.size()-1);
- cout<<"先序遍历结果:";
- PreOrder(lpRoot);
- cout<<endl;
-
- cout<<"中序遍历结果:";
- MidOrder(lpRoot);
- cout<<endl;
-
- cout<<"后序遍历结果:";
- PostOrder(lpRoot);
- cout<<endl;
- Release(lpRoot);
- cout<<endl;
-
-
- system("pause");
- return 0;
- }
(1)程序1的输入方式:
已知二叉树的中序与后序序列,求先序序列,请先输入中序序列,回车后输入后序序列:
例如输入:
DGBAECHF
GDBEHFCA
输出:
先序遍历结果:ABDGCEFH
中序遍历结果:DGBAECHF
后序遍历结果:GDBEHFCA
(2)程序2的输入方式:
已知二叉树的先序与中序序列,求后序序列,请先输入先序序列,回车后输入中序序列:
例如输入:
abdefgc
debgfac
输出:
先序遍历结果:abdefgc
中序遍历结果:debgfac
后序遍历结果:edgfbca
最后请看该程序运行效果图:
这是程序1所确定的二叉树图:
这是程序2所确定的二叉树图:
by Loomman, QQ:28077188, MSN: Loomman@hotmail.com QQ裙:30515563 ☆程序天堂☆ 请尊重作者原创,转载注明来自裂帛一剑博客,谢谢合作。
分享到:
相关推荐
二叉树的遍历C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历实例C语言二叉树遍历...
下面将详细介绍二叉树的三种基本遍历方法:前序遍历、中序遍历和后序遍历,以及如何用C语言来实现它们。 1. 前序遍历(根-左-右) 前序遍历的顺序是先访问根节点,然后遍历左子树,最后遍历右子树。C语言实现可以...
二叉树的创建与遍历C语言实现代码.zip二叉树的创建与遍历C语言实现代码.zip二叉树的创建与遍历C语言实现代码.zip二叉树的创建与遍历C语言实现代码.zip二叉树的创建与遍历C语言实现代码.zip二叉树的创建与遍历C语言...
二叉树遍历(C语言),输出遍历结果,入门小程序,适合C语言入门小练习 二叉树遍历(C语言),输出遍历结果,入门小程序,适合C语言入门小练习 二叉树遍历(C语言),输出遍历结果,入门小程序,适合C语言入门小...
本文将详细介绍二叉树遍历的相关知识点,特别是用C语言实现时的特点。 #### 二叉树简介 二叉树是一种树形结构,每个节点最多有两个子节点:一个左子节点和一个右子节点。根据节点间的关系,二叉树可以分为多种类型...
二叉树遍历(c语言、python、java的实现).rar 二叉树遍历(c语言、python、java的实现).rar 二叉树遍历(c语言、python、java的实现).rar 二叉树遍历(c语言、python、java的实现).rar 二叉树遍历(c语言、...
二叉树的遍历 C语言 数据结构课设 本文将详细讲解二叉树的遍历的实现,包括二叉树的存储、先序遍历、中序遍历、后序遍历和叶子结点的统计。 一、需求分析 二叉树的遍历是数据结构课程的经典案例,本文将使用 C ...
给定的C语言代码实现了二叉树的创建及前序、中序、后序遍历,但仅展示了递归实现。下面,我们将重点分析非递归遍历的实现。 #### 四、非递归前序遍历 ```c void PreOrderNonRecursive(BitTree T) { Stack S; // ...
在这个场景中,我们关注的是使用C语言实现二叉树的遍历,包括先序遍历、中序遍历和后序遍历,以及非递归的中序遍历。这些遍历方法是理解二叉树特性和操作的关键。 1. **先序遍历**:先序遍历的顺序是根节点 -> 左...
本文将深入探讨C语言中实现二叉树遍历的方法,包括先根遍历、中根遍历和后根遍历,并通过程序分析帮助理解这些概念。 **先根遍历(Preorder Traversal)** 先根遍历的顺序是:先访问根节点,然后递归地遍历左子树,...
数据结构二叉树的遍历,采用C语言实现二叉树的非递归先序、中序、后序遍历算法
然而,在没有递归的情况下,也可以使用堆栈来实现遍历,尤其是对于前序和后序遍历。 #### 使用堆栈实现前序遍历 在前序遍历中,我们首先将根节点压入堆栈,然后重复以下步骤直到堆栈为空: - 弹出当前节点,并访问...
二叉树遍历 c 层遍历 完整结构层遍历 只有层遍历代码及创建二叉树代码
本篇将详细介绍如何用C语言实现二叉树的递归与非递归遍历,以及如何计算节点数、树的深度和宽度。 首先,我们来看二叉树的递归遍历,主要包括前序遍历、中序遍历和后序遍历: 1. **前序遍历**:先访问根节点,然后...
### C语言实现二叉树的创建与遍历 在计算机科学中,二叉树是一种重要的数据结构,它具有丰富的应用场景,比如文件系统、编译器的设计等。本篇文章将详细介绍如何使用C语言来实现二叉树的基本操作:创建与遍历。 ##...
二叉树遍历问题C语言源码和简单教程 二叉树是一种常用的数据结构,遍历是指从根节点开始,对树中的每个节点进行访问的过程。二叉树的遍历方式有多种,例如前序遍历、中序遍历和后序遍历等。每种遍历方式都有递归和...
本文将详细介绍如何用C语言实现二叉树的三种基本遍历方法:前序遍历、中序遍历以及后序遍历。 #### 二、二叉树的基本概念 二叉树是由节点组成的数据结构,每个节点最多有两个子节点,通常被称作左子节点和右子节点...
用c语言实现二叉树的三种遍历,所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行...
### 层次遍历二叉树C语言实现详解 #### 核心概念解析 在深入分析给定代码之前,我们先来理解一下几个关键的概念。 **二叉树**:二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常被称作左子节点和右...
本文将详细介绍二叉树的遍历方法及其应用场景,并通过具体的案例来探讨如何在实际编程中实现这些遍历。 #### 二、课题设计背景 《数据结构》这门课程起源于上世纪60年代末的美国,由唐·欧·克努特教授创立。随着...