数据结构——二叉树总结

本文详细介绍了二叉树的概念,包括树的定义和二叉树的特性。二叉树的遍历方法包括递归和非递归实现的先序、中序、后序以及层次遍历。此外,还探讨了如何根据遍历序列还原二叉树,以及二叉树在实际应用中的角色,如二叉查找树、AVL树、哈夫曼树、堆和并查集。
摘要由CSDN通过智能技术生成


写在前面

  1. 树的定义:树是n(n>=0)个结点的有限集合,n=0时,称为空树。在任意一棵非空树中应满足:①有且仅有一个特定的称为的结点。②当n大于1时,其余结点可以分为m(m>0)个互不相交的有限集合,其中每一个集合本身又是一棵树,并且称为根节点的子树。树是一种递归的数据结构。

  2. 二叉树的定义:二叉树是n(n>=0)个结点的有限集合:①n=0时,为空二叉树。②n>0时,由一个根结点和两个互不相交的被称为根的左子树和右子树组成。右子树和左子树分别是一棵二叉树。二叉树是有序树,若将其左右子树颠倒,则成为另一棵不同的二叉树。

  3. 二叉树和度为2的有序树的区别:①度为2的树至少有三个结点,而二叉树可以为空。②度为2的有序树的孩子结点的左右次序是相对的,而二叉树的孩子结点的左右次序是绝对的。



二叉树遍历

二叉树的遍历是指通过一定的顺序访问二叉树的所有结点。遍历方法一般有四种:先序遍历、中序遍历、后序遍历以及层次遍历,其中前三种一般用深度优先搜索(DFS)实现,而层次遍历一般用广度优先搜索(BFS)实现。另外前三种也可以通过递归实现。

递归实现先、中、后序遍历

先序:
void preOrder1(BinTree *root) //递归先序遍历
{
   
	if(root!=NULL)
	{
   
		cout<<root->data<<" ";
		preOrder1(root->lchild);
		preOrder1(root->rchild);
	}
}
中序:
void inOrder1(BinTree *root) //递归中序遍历
{
   
	if(root!=NULL)
	{
   
		inOrder1(root->lchild);
		cout<<root->data<<" ";
		inOrder1(root->rchild);
	}
}
后序:
void postOrder1(BinTree *root) //递归后序遍历
{
   
	if(root!=NULL)
	{
   
		postOrder1(root->lchild);
		postOrder1(root->rchild);
		cout<<root->data<<" ";
	}
}

非递归遍历

先序、中序、后序是通过栈实现非递归。
层次遍历是通过队列实现

先序非递归

void preOrder2(BinTree *root) //非递归先序遍历
{
   
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty())
    {
   
        while(p!=NULL)
        {
   
            cout<<p->data<<" ";
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty())
        {
   
            p=s.top();
            s.pop();
            p=p->rchild;
        }
    }
}

中序非递归

void inOrder2(BinTree *root) //非递归中序遍历
{
   
    stack<BinTree*> s;
    BinTree *p=root;
    while(p!=NULL||!s.empty(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值