一、二叉树算法题备考方向
1.树的遍历
- 前、中、后序列遍历(个人认为只备考递归算法即可)
- 层序遍历
2. 树的属性
-
求树的高度
-
求树的宽度
-
求WPL
3.特殊树形判定
- 是否为二叉排序树(左<中<右)
- 二叉树是否平衡(|左-右|<=1)
- 是否为完全二叉树
二、相关代码
1.二叉树节点定义
//二叉树的结点定义(链式存储)
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
2.前序遍历PreOrder
//前序遍历 (根左右)
void PreOrder(BiTNode *root)
{
if(root == NULL)
return;
Visit(root); //可以根据题目灵活写visit函数
PreOrder(root->lchild);
PreOrder(root->rchild);
}
3.中序遍历InOrder
//中序列遍历
void InOrder(BiTNode *root)
{
if(root == NULL)
return;
PreOrder(root->lchild);
Visit(root); //可以根据题目灵活写visit函数
PreOrder(root->rchild);
}
4.后序遍历
//后序列遍历
void PostOrder(BiTNode *root)
{
if(root == NULL)
return;
PreOrder(root->lchild);
PreOrder(root->rchild);
Visit(root); //可以根据题目灵活写visit函数
}
5.层次遍历
算法思想是通过以下4步:首先初始化一个队列,判断队列是否为空,如果不为空,则让队头元素出队,并且访问队头元素,且让队头元素的左、右孩子分别入队。
//初始化队列 void InitQueue(Queue &Q); //判断队列是否为空 bool IsEmpty(Queue &Q); //新元素x入队 void EnQueue(Queue &Q,BiTNode* x); //队头元素出队并返回x为队头 void DeQueue(Queue &Q,BiTNode* &x)
实现代码如下:
//层序遍历
void LevelOrder(BiTNode *T)
{
Queue Q;
InitQueue(Q);
BiTNode *p;
EnQueue(Q,T);
while (!IsEmpty(Q))
{
DeQueue(Q,p);//p是为了返回队头元素
visit(p);
if(p->lchild != NULL)
{
EnQueue(Q,p->lchild);
}
if(p->rchild != NULL)
{
EnQueue(Q,p->rchild);
}
}
}