IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树遍历及基本操作 -> 正文阅读

[数据结构与算法]二叉树遍历及基本操作

一、二叉树遍历

1、前序遍历(根左右----DLR)

/* 递归 */
void PreOrder(BiTNode *root)
{
	if(root == nullptr)
		return;
	cout<<root->data<<" ";   //先输出当前结点
	PreOrder(root->lchild);        //输出左孩子
	PreOrder(root->rchild);        //输出右孩子
}

/* 非递归 */
void PreOrder(BiTNode *root)
{
	if(root == nullptr)
		return;
	stack<BiTNode*> st;
	cout<<root->data<<" "<<endl;   //先输出当前结点
	st.push(root);                  //入栈
	root = root->lchild;
	while(!st.empty() || root)
	{
		while(root)
		{
			cout<<root->data<<" ";  //先输出当前结点
			st.push(root);        
			root = root->lchild;    //再输出左孩子
		}
		// while 结束意味着左孩子已经全部输出,开始输出右孩子
		root = st.top()->rchild;
		st.pop();
	}
}

2、中序遍历(左根右----LDR)

/* 递归 */
void InOrder(BiTNode *root)
{
	if(root == nullptr)
		return;
	InOrder(root->lchild);        //输出左孩子
	cout<<root->data<<" ";         //输出当前结点
	InOrder(root->rchild);        //输出右孩子
}

/* 非递归 */
void InOrder(BiTNode *root)
{
	if(root == nullptr)
		return;
	stack<BiTNode*> st;
	st.push(root);                 
	root = root->lchild;      //访问左孩子
	while(!st.empty() || root)
	{
		while(root)
		{
			st.push(root);
			root = root->lchild;
		}
		//左孩子已遍历完,进行输出
		cout<<st.top()->data<<" ";   
		root = st.top()->rchild;     //遍历右孩子
		st.pop();
	}
}

3、后序遍历(左右根----LRD)

/* 递归 */
void PostOrder(BiTNode *root)
{
	if(root == nullptr)
		return;
	PostOrder(root->lchild);
	PostOrder(root->rchild);
	cout<<root->data<<" ";
}

/* 非递归 */
/*
对于一个结点,如果要输出它,只有它既没有左孩子也没有右孩子或者它有孩子但是它的孩子已经被输出(由此设置 pre 变量)。若非上述两种情况,则将该结点的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,先依次遍历左子树和右子树
*/
void PostOrder(BiTNode *root)
{
	if(root == nullptr)
		return;
	stack<BiTNode*> st;
	BiTNode *pre = nullptr;
	st.push(root);                 
	while(!st.empty() || root)
	{
		root = st.top();            //取栈顶元素判断
		if((root->lchild==nullptr && root->rchild==nullptr)||
		(pre && (pre == root->lchild || pre == root->rchild)))
		{
			//首先输出的是无左右孩子结点或者它有孩子但是它的孩子已经被输出
			cout<<root->data<<" ";
			pre = root;
			st.pop();
		}
		else
		{
			if(root->rchild)
				st.push(root->rchild);   //先右后左进栈,出来就是先左后右
			if(root->lchild)
				st.push(root->lchild);
		}
	}
}

4、层次遍历

基于广度优先搜搜思想的二叉树遍历算法,依次对于每一层进行遍历,直到遍历到二叉树最下面一层的结点为止,需要用一个队列结构辅助实现(先进先出)。

void LayerOrder(BiTNode *root)
{
	queue<BitNode*> Q;
	BiTNode *p = root;
	if(p == nullptr)
		return;
	Q.push(p);               //入队
	while(!Q.empty())
	{
		p = Q.front();      //取出队头元素并输出
		cout<<p->data<<" ";
		Q.pop();
		//从左到右依次入队
		if(p->lchild)
			Q.push(p->lchild);
		if(p->rchild)
			Q.push(p->rchild);
	}
}

二、二叉树的深度和叶子结点个数

1、二叉树深度

深度优先遍历,比较左右深度

int maxDepth(BiTNode* root)
{
    if(root == nullptr)
        return 0;
    int left_len = maxDepth(root->left) + 1;
    int right_len = maxDepth(root->right) + 1;
    return left_len>right_len?left_len:right_len;
}

2、二叉树叶子节点数

所谓叶子结点就是其左孩子和右孩子均为NULL的结点。遍历整棵二叉树,统计叶子结点个数。

int getLeavesCount(BiTNode *root)
{
	if(root == nullptr)
		return 0;
	if(root->left==nullptr && root->right==nullptr)
		return 1;
	return getLeavesCount(root->left) + getLeavesCount(root->left);
}
//如果是求树的结点数,直接就是遍历左右子树加上根结点
int getCount(BiTNode *root)
{
	if(root == nullptr)
		return 0;
	return getCount(root->left) + getCount(root->left) + 1;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:59:14  更:2021-07-30 13:01:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:48:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码