首页 > 其他分享 >二叉树的创建和中序及后序遍历

二叉树的创建和中序及后序遍历

时间:2023-04-15 16:45:33浏览次数:43  
标签:ch BiTree 中序 访问 遍历 二叉树 include

二叉树的创建和中序及后序遍历

二叉的先序创建

屏幕截图(321)

使用#号来表示该结点为null

屏幕截图(322)

实现代码

先进行先序创建然后进行先序遍历

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
//#define int long long
#define yes cout<<"YES"<<'\n'
#define no 	cout<<"NO"<<'\n'

using namespace std;

typedef struct BiNode {
	char data;//数据域
	struct BiNode *lchild;//左孩子指针
	struct BiNode *rchild;//右孩子指针
} BiNode, *BiTree;//定义二叉树结点

/*
  按照先序创建
 */
void CreateBiTree(BiTree &T) {
	char ch;
	cin >> ch;
	if (ch == '#') {
		T = NULL;
		return;
	} else {
		T = new BiNode;//开辟结点
		T->data = ch; //对数据域赋值
		CreateBiTree(T->lchild);//建立左子树
		CreateBiTree(T->rchild);//建立右子树
	}
}
/*
  前序遍历
 */
void DLR(BiTree T) {
	if (T == NULL) {
		return ;
	} else {
		char ch = T->data;
		cout << ch;
		DLR(T->lchild);
		DLR(T->rchild);
	}

}
/*
  中序遍历
 */
void LDR(BiTree T) {
	if (T == NULL) {
		return ;
	} else {
		char ch = T->data;

		LDR(T->lchild);//先访问左子树
		cout << ch;//再访问根结点
		LDR(T->rchild);//再访问右子树
	}

}
/*
  后序遍历
 */
void LRD(BiTree T) {
	if (T == NULL) {
		return ;
	} else {
		char ch = T->data;

		LRD(T->lchild);//先访问左子树
		LRD(T->rchild);//再访问右子树
		cout << ch;//再访问根结点
	}

}

int main () {
	BiTree root = NULL;
	CreateBiTree(root);
	DLR(root);
	cout << '\n';

//	LDR(root);
//	cout<<'\n';

//	LRD(root);
	return 0;
}
/*
  abc##de#g##f###

 */

二叉树的中序遍历

1.先访问左子树

2.再访问根结点

3.最后访问右子树

屏幕截图(324)

中序遍历示意图

屏幕截图(335)

中序遍历算法实现

屏幕截图(336)

二叉树的后序遍历

  1. 先访问左子树

  2. 再访问右子树

  3. 最后访根结点

    屏幕截图(325)

    后序遍历的示意图

    屏幕截图(337)

    后序遍历的算法实现

    屏幕截图(338)

一道例题

屏幕截图(326)

第二道例题

屏幕截图(328)

完整的代码实现

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cstring>
#include <unordered_set>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <sstream>
#include <queue>
#define int long long


using namespace std;

typedef struct BiNode {
	struct BiNode *lchild, *rchild;//左孩子右孩子
	char data;//数据域

} BiNode, *BiTree;

/*
  二叉树的先序创建
 */
void CreateBitree(BiTree &T) {
	char ch;
	cin >> ch;
	if (ch == ',') {
		T = NULL; //,表示该结点为空
	} else {
		T = new BiNode; //创建一个新结点
		T->data = ch; //给数据域赋值
		CreateBitree(T->lchild);//建立左子树
		CreateBitree(T->rchild);//建立右子树
	}

}
/*
  二叉树的先序遍历
 */
void DLR(BiTree T) {
	if (T == NULL) {
		return;
	} else {
		cout << T->data; //先访问根
		DLR(T->lchild);//访问左子树
		DLR(T->rchild);//访问右子树
	}



}
/*
  二叉树的中序遍历
 */
void LDR(BiTree T) {
	if (T == NULL) {
		return;
	} else {

		LDR(T->lchild);//访问左子树
		cout << T->data; //访问根
		LDR(T->rchild);//访问右子树
	}



}
/*
  二叉树的后序遍历
 */
void LRD(BiTree T) {
	if (T == NULL) {
		return;
	} else {

		LRD(T->lchild);//访问左子树
		LRD(T->rchild);//访问右子树
		cout << T->data; //访问根
	}



}

signed main () {
	BiTree root = NULL; //创建根结点
	cout << "请输入需要建立的二叉树的数值\n";
	CreateBitree(root);//创建二叉树
	cout << "下面是二叉树先序遍历结果\n";
	DLR(root);
	cout << "\n下面是二叉树中序遍历结果\n";
	LDR(root);
	cout << "\n下面是二叉树后序遍历结果\n";
	LRD(root);

	return 0;
}
/*
  abc,,de,g,,f,,,
  中序:
  cbegdfa
  后序:
  cgefdba

 */



标签:ch,BiTree,中序,访问,遍历,二叉树,include
From: https://www.cnblogs.com/harper886/p/17321376.html

相关文章

  • 【数据结构】二叉树的基本操作与遍历(C语言)
     目录定义满二叉树 完全二叉树性质应用计算二叉树结点个数 计算叶子结点的个数第 k层结点的个数查找值为x的节点遍历前序遍历中序遍历后序遍历层序遍历判断是否为完全二叉树定义......
  • 关于js对象遍历保证顺序的问题
    Object.keys(obj).sort().forEach(...),注:仅用于对象的key值是可定义顺序的,如key值为时间错,数字等,通过sort(),可默认按照数组大小排序(也可通过sort的自定义函数排序)object.keys/values()和forin不能保证对象传成数组或遍历的顺序友情链接1友情链接2......
  • 树的遍历-二叉树
    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。输入格式:输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。输出格式:在一行中输出该树的层序遍......
  • 二叉树遍历(102.144.94.145)
    102.二叉树的层序遍历BPS/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr)......
  • UVA - 699 The Falling Leaves 二叉树
    题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19244题意:给定一棵二叉树,把根节点标号成0,然后每往左走标号就减1,每往右走标号就加1,问相同标号的节点的值得和,按标号的大写依次输出思路:输入挺坑的,不过看了一会,可以边输入边建树,碰到其他值要接着往下递归建树,碰到-1......
  • LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,至少在算法题解方面确定了小彭的风格。虽然竞赛算法题的文章受众非常小,但却有很多像我一样的初学者,他们有兴趣参加但容易被题目难......
  • 二叉树先序,中序,后序遍历的非递归算法(一)
    前序遍历的非递归算法<法一>思路:二叉树的前序遍历过程:从树根开始沿着左子树一直深入,直到最左端无法深入时,返回;进入最近深入时遇到结点的右子树,再进行如此的深入和返回;直到最后从根节点的右子树返回到根节点为止;由其深入返回的过程我们知道可以用一个栈来帮助我们消除递归......
  • JSTL遍历数组,List,Set,Map等集合
    <%int[]ages={1,2,3,4,5};//普通数组,JSTL直接使用JSP赋值表达式来取List<String>names=newLinkedList<String>();//Listnames.add("Biao");names.add("彪");names.add("雷");request.setAttribu......
  • 二叉树的先序遍历
    二叉树的先序遍历遍历二叉树遍历方法遍历方法有先序遍历,中序遍历,和后序遍历先序遍历:按照根,左子树,右子树的顺序遍历中序遍历:按照先左子树,根和右子树的顺序遍历后序遍历:按照先左子树,右子树和根的顺序遍历使用递归进行遍历二叉树的先序遍历算法示意图算法实现......
  • 4月12日数据结构,线索二叉树,哈夫曼树,哈夫曼编码
    线索二叉树与以往的二叉树略有不同,普通二叉树在访问到叶子结点的时候会返回,往往递归的效率并不高,有时还可能有栈溢出的风险,但是线索二叉树在访问到叶子结点的时候因为没有左右孩子,所以他左边存放他前驱的指针。右边存放后继的指针,是指从一个非线性结构变成了一个可以线性访问的的......