二叉树的基本概念
每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒。
性质:
1、非空二叉树的第n层上至多有2^(n-1)个元素。
2、深度为h的二叉树至多有2^h-1个结点。
3、满二叉树:所有终端都在同一层次,且非终端结点的度数为2。
4、在满二叉树中若其深度为h,则其所包含的结点数必为2^h-1。
5、完全二叉树:除了最大的层次即成为一颗满二叉树且层次最大那层所有的 结点均向左靠齐,即集中在左面的位置上,不能有空位置。
对于完全二叉树,设一个结点为i则其父节点为i/2,2i为左子节点,2i+1为右子节点。
前序遍历:中-左-右
void PreTraverTree(NodeBinaryTree *ps)//前序遍历
{
if (ps != NULL)//当二叉树不为空时遍历
{
cout<<ps->data<<' ';
if (ps->Left != NULL) PreTraverTree(ps->Left);
if (ps->Right != NULL) PreTraverTree(ps->Right);
}
}
中序遍历:左-中-右
void InTraverTree(NodeBinaryTree *ps)//中序遍历
{
if (ps != NULL)
{
if (ps->Left != NULL) InTraverTree(ps->Left);
cout << ps->data << ' ';
if (ps->Right != NULL) InTraverTree(ps->Right);
}
}
后序遍历:左-右-中
void EndTraverTree(NodeBinaryTree *ps)//后序遍历
{
if (ps != NULL)
{
if (ps->Left != NULL) EndTraverTree(ps->Left);
if (ps->Right != NULL) EndTraverTree(ps->Right);
cout << ps->data << ' ';
}
}
层序遍历:由上到下,由左到右
void SequeTraverTree(NodeBinaryTree *ps)//层序遍历
{
queue<NodeBinaryTree *> q;
if (ps)
q.push(ps);
while (q.empty()==false)
{
NodeBinaryTree *temp = q.front();//q.front()代表队列q的首个元素 //法一
cout << temp->data << "->";
q.pop();//出队列。每执行一次,最先进去队列的元素出队列,下个元素随即变成q.front()代表的元素
if (temp->Left)
{
q.push(temp->Left);
}
if (temp->Right)
{
q.push(temp->Right);
}
//cout << q.front()->data << "->";//法二
//if (q.front()->Left)
//{
// q.push(q.front()->Left);
//}
//if (q.front()->Right)
//{
// q.push(q.front()->Right);
//}
//q.pop();
}
}