二叉树习题 |
---|
1.通过前序序列和中序序列构造二叉树 |
2.通过层次遍历序列和中序序列创建一棵二叉树 |
3.求一棵二叉树的结点个数 |
4.求一棵二叉树的叶子节点数 |
5.求一棵二叉树中度为1的节点个数 |
6.求二叉树的高度 |
7.求一棵二叉树中值为x的节点作为根节点的子树深度 |
8.判断两棵树是否相似,相似返回1,不相似返回0 |
9.设计算法利用叶子结点中的空指针域将所有叶子结点链接成一个带头结的双链表 |
10.假设一个仅包含二元运算的算术表达式以二叉链表形式存放在二叉树T,设计算法求解算术表达式 |
11.判断二叉树是否为完全二叉树(二叉树的层序遍历) |
12.求一棵二叉树的最大宽度 |
文章目录
1.通过前序序列和中序序列构造二叉树
创建树的过程,就是明确子树的创建过程,明确子树的创建过程,就是明确根节点的创建过程
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void preOrder(BiTree T) //二叉树的前序遍历,传入一个二叉树
{
if(T!=NULL) //子树根节点不为空
{
printf("%c ",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
BiTNode * creatBitree(ElemType preOrderList[],int preStartIndex,int preEndIndex,
ElemType inOrderList[],int inStartIndex,int inEndIndex)
{
//确定递归结束条件,先序序列循环一遍
if(preStartIndex>preEndIndex)
{
return NULL;
}
//创建一个根节点
BiTNode *T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=preOrderList[preStartIndex]; //先序序列开始位置为根节点
//找当前根节点在中序序列的位置,确定当前根节点的左右子树
int rIndex=0; //当前在中序遍历中找到的根节点的索引
for(rIndex=inStartIndex;rIndex<=inEndIndex;rIndex++ )
{
if(inOrderList[rIndex]==T->data)break;
}
//此时要在中序序列中,确定左右子树
//当前左子树,应该是instratIndex到rIndex-1
//当前右子树,应该是rIndex+1到inEndIndex
//此时的先序序列的左子树,preStartIndex+1到preStartIndex+length
//先序序列的右子树,preStartIndex+length+1 preEndIndex
int length=rIndex-inStartIndex;
T->lchild=creatBitree(preOrderList, preStartIndex+1, preStartIndex+length, inOrderList, inStartIndex, rIndex-1);
T->rchild= creatBitree(preOrderList, preStartIndex+length+1, preEndIndex, inOrderList, rIndex+1, inEndIndex);
return T; //把根节点返回回去
}
int main() {
char preOrderList[]={
'A','B','D','E','C','F','G'};
int preOrderListLength=7;
char inOrderList[]={
'D','B','E','A','F','C','G'};
int inOrderListLength=7;
BiTree T= creatBitree(preOrderList, 0, preOrderListLength-1, inOrderList, 0, inOrderListLength-1);
preOrder(T);
printf("\n");
}
总结回顾:
整体上来说,整个建树的过程就是树的先序遍历,传入参数是,二叉树的先序遍历序列,先序遍历序列的起始位置,终止位置,二叉树的中序遍历序列,中序遍历序列的起始位置,终止位置,函数开始,首先建一个根节点,给根节点赋初值,就是当前递归中先序二叉树序列的起始位置,然后通过当前这个确定的根节点,在当前的中序二叉树序列中,找到该值,该值的左边就是它的左子树,右边就是它的右子树,处理好下一层递归的下标,递归建立当前结点的左右子树。
2.通过层次遍历序列和中序序列创建一棵二叉树
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void preOrder(BiTree T) //二叉树的前序遍历,传入一个二叉树
{
if(T!=NULL) //子树根节点不为空
{
printf("%c ",T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
BiTNode * secend_creatBitree(char leverOrderList[],int LevelstartIndex,int LevelendIndex,char inOrderList[],int inStartIndex,int inEndIndex)
{
if(LevelstartIndex>LevelendIndex) return NULL;
// 创建根节点
BiTNode *T=(BiTNode *)malloc(sizeof