数据结构—二叉树总结
写在前面
-
树的定义:树是n(n>=0)个结点的有限集合,n=0时,称为空树。在任意一棵非空树中应满足:①有且仅有一个特定的称为根的结点。②当n大于1时,其余结点可以分为m(m>0)个互不相交的有限集合,其中每一个集合本身又是一棵树,并且称为根节点的子树。树是一种递归的数据结构。
-
二叉树的定义:二叉树是n(n>=0)个结点的有限集合:①n=0时,为空二叉树。②n>0时,由一个根结点和两个互不相交的被称为根的左子树和右子树组成。右子树和左子树分别是一棵二叉树。二叉树是有序树,若将其左右子树颠倒,则成为另一棵不同的二叉树。
-
二叉树和度为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(