学习目标:
二叉树的基本操作与例题
学习内容:
二叉树的结点定义
前序遍历
中序遍历
后序遍历
二叉树遍历的例题
学习时间:
2021.4.7 8:00到10:00 14:30到4:30
学习产出:
二叉树的结点类型定义:
//二叉树的结点类型定义
typedef struct BTNode
{
char data;
struct BTNode* lchild;
struct BTNode* rchild;
}BTNode;
先序遍历:
//先序遍历
void preorder(BTNode* p)
{
if (p != NULL)
{
visit(p);
preorder(p->lchild);//遍历左子树
preorder(p->rchild);//遍历右子数
}
}
中序遍历:
//中序遍历
void inorder(BTNode* p)
{
if (p != NULL)
{
inorder(p->lchild);
visit(p);
inorder(p->rchild);
}
}
后序遍历:
//后序遍历
void postorder(BTNode* p)
{
if (p != NULL)
{
postorder(p->lchild);
postorder(p->rchild);
visit(p);
}
}
eg6.1.1:表达式(a- (b+))*(d/e)存储在一棵以二又链表为存储结构的二叉树中(二叉附结点的data域为字符型),编写程序求出该表达式的值(表达式中的操作数都是一位的整数)
int comp(BTNode* p)
{
int A, B;
if (p != NULL)
{
if (p->rchild != NULL && p->lchild != NULL)
{
A = comp(p->lchild); //后序遍历左子树,并赋值给A
B = comp(p->rchild); //后序遍历右子树,并赋值给B
return op(A, B, p->data); //根据A和B算出p的值
}
else
return p->data - '0';//如果左右都为空,则是数值,直接返回->data - '0'将字符型数字变为整型数字
}
else
return 0;
}
eg6.1.2:写一个算法求一 棵二叉树的深度,二叉树以二叉链表为存储方式。
int getDepth(BTNode* p)
{
int LD, RD;
if (p == NULL)
return 0; //如果是空树,直接返回0
else
{
LD = getDepth(p->lchild); //求左子树深度
RD = getDepth(p->rchild); //求右子树深度
return (LD > RD ? LD : RD) + 1; //A?B:C是一个三目运算符表达式 A真返回B反之返回C 这里为max{LD,RD}
}
}
**eg6.1.3:**在一棵以二又链表为存储结构的二叉树中, 查找data域值等于key 的结点是否存在(找重要到任何一个满足要求的结点即可), 如果存在,则将q指向该结点,否则q赋值为NULL,假设data为int型
void search(BTNode* p, BTNode*& q, int key) //q要变 加&
{
if (p != NULL)
{
if (p->data == key) //如果相等则p赋值给q
q = p;
else //如果不等就去子树查找
{
search(p->lchild, q, key);
if (q == NULL)
search(p->rchild, q, key); //剪枝:如果左已经找到 无需再遍历右树
}
}
}
**eg6.1.4:**假设二叉树采用二叉链表存储结构存储,编写一个程序,输出先序遍历序列中第k个结点的值,假设k不大于总的结点数(结点data域类型为char型)。
void pretrave(BTNode* p, int k) //前
{
if (p != NULL)
{
++n; //计数君
if (k = n)
{
cout << p->data << end1;
return;
}
pretrave(p->lchild, k);
pretrave(p->rchild, k);
}
}
void intrave(BTNode* p, int k) //中
{
if (p != NULL)
{
intrave(p->lchild, k);
++n; //计数君
if (k = n)
{
cout << p->data << end1;
return;
}
intrave(p->rchild, k);
}
}
void posttrave(BTNode* p, int k) //后
{
if (p != NULL)
{
posttrave(p->lchild, k);
posttrave(p->rchild, k);
++n; //计数君
if (k = n)
{
cout << p->data << end1;
return;
}
}
}