day37假设二叉树采用二叉链表存储,设计一个算法求二叉树的高度(递归和非递归实现)
[递归]算法思想 递归求左子树高度 右子树高度 取较大者+1
1、递归求解
思路概括:
若根节点为NULL,则直接返回0;----无数据
若左子树不为NULL,则递归去求左子树的高度,
若右子树不为NULL,则递归去求右子树的高度。
得到左子树和右子树的高度,
根据二叉树的高度定义:左子树和右子树中高度较大者为二叉树的高度
因此对其进行左子树和右子树高度的判断,return deep(较大者)+1;
+1代表根节点也是一层!!!
//二叉树递归求高度
int GetHeightByBiTree(BiTree * root){
//第一种情况,判断是否为空
if(root == NULL){
return 0;//注意!,这里也是作为递归的出口
}
//递归获取左右子树的高度
int depth_Left = GetHeightByBiTree(root->lchild);
int depth_Right = GetHeightByBiTree(root->rchild);
//进行比较,较大者为子树的高度
if(depth_Left < depth_Right){
return depth_Right+1;//+1代表跟结点也为一层
}else{
//这里包括了depth_Left == depth_Right的情况
return depth_Left+1;
}
}
day38 设树B是一棵链式结构存储的二叉树,编写一个树中所有结点的左右子树进行交换的函数。【考研真题】
思路:
1.在对于一个问题进行具体的操作无法对其进行定义时,需要用到抽象的方法进行设计,抽象-----最佳体现便是递归。
2.递归的交换左右子树
3.先交换根节点的左右子树
4.做交换第二层的结点
这里引出C语言中最为频繁的交换代码内容:
//例子 a与b交换
int temp=a;
a=b;
b=temp;
其采用递归的方法进行设计代码如下:
//递归的交换结点
void Swap_Btree(Btree*root){
Btree*temp;
if(root==NULL){
return ;}
if(root!=NULL){
//不为空
swap(root->lchild);//交换左子树
swap(root->rchild);//交换右子树
//开始交换
temp=root->lchild;
root->lchild=root->rchild;
root->rchild=temp;
}
}
day39
假设二叉树采用二叉链表存储结构存储,试着设计一个算法,计算一棵给定二叉树的所有双分支(度为2)的结点个数。
结合以上的图片进行情况分析
第一种情况:空节点则代表着左右子树的双分支节点为0,因此返回为0
第二种情况:双分支节点则代表着双分支节点的个数等于(左子树的双分支节点+右子树的双分支节点+1),+1的原因在于根节点也是一个双分支节点。
第三种情况:根节点为单分支节点,从而双分支节点的个数=(左子树中的双分支个数+右子树的个数)。
//结构体
typedef struct BiTree{
int data;
struct BiTree* lchild,*rchild;
}*BiTree;
//递归求二叉树中的双分支节点的个数
int DoubeTreeNodeNum