https://www.cnblogs.com/kangjianwei101/p/5243404.html
目录
36-47 二叉树
6.3,6.5,6.6,6.10,6.13,6.14,6.19,6.20,6.21,6.23,6.24,6.26,6.27, 6.28,6.29,6.30,6.36,6.41,6.42,6.43,6.47,6.49,6.56,6.60,6.62,6.65,6.69
3
5
6
10 ??
(1)显然该二叉树为正则二叉树,没有度为1的结点,只有度为0的叶子和度为2的分支
按二叉树性质n0 = n2 + 1,因此度为2结点数为n - 1
于是该二叉树有2n-1个结点![v![](https://img-blog.csdnimg.cn/20210416100342295.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhbjI5Xw==,size_16,color_FFFFFF,t_70)
13,14
19 树->二叉树
20 森林->二叉树 线索化
方法:https://jingyan.baidu.com/article/19020a0a743851529d28421a.html
https://jingyan.baidu.com/article/cd4c2979abd74f346e6e60ed.html
树变成二叉树:从树的根结点开始,从上到下,看每一个结点,把你正在看的结点的孩子放在左子树,兄弟放在右子树。
将一个森林转换为二叉树:
将森林中的每棵树变为二叉树;2.因为转换所得的二叉树的根结点的右子树均为空,故可将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
21 二叉树->森林
23
知中后求前:https://blog.csdn.net/WIFIfw/article/details/105312581
二叉树的先根序列与等价树的先根序列相同,二叉树的中序序列对应着树的后根序列。
24
26
27 序列画树
28
上
29
上
30
36
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;
int BiTreeEmpty(BiTree T)//判断树是否为空
{
return T == NULL ? 1 : 0;
}
int IsSimilar(BiTree t1, BiTree t2)
{
if (BiTreeEmpty(t1) && BiTreeEmpty(t2))//如果两个树都是空
return 1;
else//非空
{
if (!BiTreeEmpty(t1) && !BiTreeEmpty(t2))
{
if (IsSimilar(t1->lchild, t2->lchild) && IsSimilar(t1->rchild, t2->rchild))
return 1;
}
}
return 0;
}
41
想知道*和&的差别:https://blog.csdn.net/weixin_43961780/article/details/106364838
编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值。
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;
int PONodeK(BiTree T, int k, TElemType& e, int& i)//k是题目要求的第k个位置;i是用来计时;e存放节点的返回值
{
if (T)
{
i++;
if (i == k)//找到该位置
e == T->data;
else
{
PONodeK(T->lchild, k, e, i);
PONodeK(T->rchild, k, e, i);
}
}
return 1;
}
42
编写递归算法,计算二叉树中叶子结点的数目。
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;
int POLeafNodeNum(int& i, BiTree T)
{
if (T)
{
if (!T->lchild && !T->rchild)
i++;
POLeafNodeNum(i, T->lchild);
POLeafNodeNum(i, T->rchild);
}
return 1;
}
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode, * BiTree;
int sum_42(BiTree T)
{
int num = 0;
if (T)
{
if (!T->lchild && !T->rchild)
num++;
else
{
num += sum_42(T->lchild);
num += sum_42(T->rchild);
}
}
return num;
}
43
编写递归算法,将二叉树中所有结点的左、右子树相互交换。
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;
int ExchangeBiTree(BiTree T)
{
BiTree t;
if (T)
{
t = T->lchild;
T->lchild = T->rchild;
T->rchild = t;
ExchangeBiTree(T->lchild);
ExchangeBiTree(T->rchild);
}
return 1;
}
47
编写按层次顺序(同一层自左至右)遍历二叉树的算法。
https://blog.csdn.net/lusic01/article/details/79819014
用队列的没有搞懂
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;
void LevelorderTraversal(BiTree T)
{
int i, j;
BiTree p[100];//树指针数组来模拟队列
i = j = 0;//i指层,j指p的顺序下标
if (T)
p[j++] = T;
while (i < j)
{
printf("%c", p[i]->data);
if (p[i]->lchild)
p[j++] = p[i]->lchild;
if (p[i]->rchild)
p[j++] = p[i]->rchild;
i++;
}
}
49 完全二叉树
编写算法判别给定二叉树是否为完全二叉树。
其他:https://blog.csdn.net/Lhj0616/article/details/78785439
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode,*BiTree;
int BiTreeDepth(BiTree T)//求树的深度
{
int LD, RD;
if (T == NULL)
return 0;
else
{
LD = BiTreeDepth(T->lchild);
RD = BiTreeDepth(T->rchild);
return (LD >= RD ? LD : RD) + 1;
}
}
int CompleteBiTree(BiTree& T)//用完全二叉树的性质
{
int d;
if (T)
{
d = BiTreeDepth(T->lchild) - BiTreeDepth(T->rchild);
if (d < 0 || d>1)//左右子树的深度差值只能取0,1
return 0;
else
{
if (CompleteBiTree(T->lchild) && CompleteBiTree(T->rchild))
return 1;
else
return 0;
}
}
else return 1;
}
56 ?? 线索二叉树
Threaded BinaryTree线索二叉树
线索二叉树:https://blog.csdn.net/S_999999/article/details/86157532?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162029043216780255224783%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162029043216780255224783&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-86157532.first_rank_v2_pc_rank_v29&utm_term=%E7%BA%BF%E7%B4%A2%E4%BA%8C%E5%8F%89%E6%A0%91
图解线索二叉树: https://blog.csdn.net/weixin_44067399/article/details/107179420?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162029043216780255224783%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162029043216780255224783&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-2-107179420.first_rank_v2_pc_rank_v29&utm_term=%E7%BA%BF%E7%B4%A2%E4%BA%8C%E5%8F%89%E6%A0%91
试写一个算法,在先序后继线索二叉树中,查找给定结点*p在先序序列中的后继(假设二叉树的根结点未知)。并讨论实现此算法对存储结构有何要求?
typedef int TElemType;
typedef enum PointerTag{Link,Thread};//Link==0,指针;Thread==1,线索
typedef struct BiThrNode
{
TElemType data;
struct BiThrNode* lchild, * rchild;
PointerTag LTag, RTag;//左右标志
}BiThrNode, *BiThrTree;
//由先序遍历创建先序线索化链表
int PreThreading(BiThrTree& T, BiThrTree& pre)
{
if (T)
{
if (!T->lchild)
{
T->LTag = Thread;
T->lchild = pre;
}
if (pre && !pre->rchild)
{
pre->RTag = Thread;
pre->rchild = T;
}
pre = T;
if (T->LTag == Link)
PreThreading(T->lchild, pre);
if (T->RTag == Link)
PreThreading(T->rchild, pre);
}
return 1;
}
int PreOderThreading(BiThrTree& TT, BiThrTree T)
{
//先序遍历二叉树T,并将其先序线索化,TT指向头节点
BiThrTree pre;
if (!(TT = (BiThrTree)malloc(sizeof(BiThrNode))))
return 0;
TT->LTag = Thread;
TT->RTag = Link;
TT->lchild = TT;//左子树回指
if (!T)
TT->rchild = TT;//若二叉树为空,右子树回指
else
{
TT->rchild = T;
pre = TT;
PreThreading(T, pre);//先序遍历进行先序线索化
pre->rchild = T;//最后一个结点线索化
pre->RTag = Thread;
TT->lchild = pre;
}
return 0;
}
//从二叉线索树上任一结点q开始查找结点*p。如果找到,将*p的后继结点指针存于q中,返回1; 否则返回0
int Find(BiThrTree& q, TElemType* p)
{
BiThrTree pt = q;
if (!pt)
return 0;
if (pt->data == *p)
{
if (pt->LTag == Link)
q = pt->lchild;
else
q = pt->rchild;
return 1;
}
pt = q->rchild;
while (pt != q && pt->data != *p)
{
if (pt->LTag == Link)
pt = pt->lchild;
else
pt = pt->rchild;
}
if (pt == q)
return 0;
if (pt->data == *p)
{
if (pt->LTag == Link)
q = pt->lchild;
else
q = pt->rchild;
}
return 0;
}
60 孩子-兄弟
孩子-兄弟链:https://blog.csdn.net/Feynman1999/article/details/72771432/
试编写算法,对一棵以孩子-兄弟链表表示的树统计叶子的个数。
#include <stdio.h>
#include <stdlib.h>
typedef struct CSNode
{
ElemType data;
struct CSNode* firstchild, * nextsibling;
}CSNode,*CSTree;
int LeafNum(CSTree& T)
{
if (T)
{
if (!T->firstchild)
return 1 + LeafNum(T->nextsibling);
else
return LeafNum(T->firstchild) + LeafNum(T->nextsibling);
}
else
return 0;
}
62
关于孩子兄弟链:https://blog.csdn.net/Feynman1999/article/details/72771432/
对以孩子-兄弟链表表示的树编写计算树的深度的算法。
#include <stdio.h>
#include <stdlib.h>
typedef struct CSNode
{
ElemType data;
struct CSNode* firstchild, * nextsibling;
}CSNode,*CSTree;
int Depth(CSTree& T)
{
int d1, d2;
if (T)
{
d1 = 1 + Depth(T->firstchild);
d2 = Depth(T->nextsibling);
return d1 > d2 ? d1 : d2;
}
else
return 0;
}
65 ?
已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。
https://blog.csdn.net/HUST_LHC/article/details/105259465
https://blog.csdn.net/qq_43661234/article/details/101538803
#include <stdio.h>
#include <stdlib.h>
typedef int elemtype;
typedef struct BTNode {
elemtype data;
struct BTNode* left, * right;
}BTNode, * BiTree;
//假设数组AB分别存储前序序列,中序序列
//l1 r1表示A[](先序序列)的最左端和最右端下标;l2,r2同理
BiTree creat(elemtype A[], elemtype B[], int l1, int r1, int l2, int r2)
{
BiTree root = (BiTree)malloc(sizeof(BTNode));
root->data = A[l1];
// printf("%d\n",root->data);
int i = l2;
for (i = l2; B[i] != A[l1]; i++); //在中序遍历序列中查找根结点位置
int llen = i - l2; //左子树长度
int rlen = r2 - i; //右子树长度
if (llen > 0)
root->left = creat(A, B, l1 + 1, l1 + llen, l2, llen + l2 - 1);
else
root->left = NULL;
if (rlen > 0)
root->right = creat(A, B, r1 - rlen + 1, r1, r2 - rlen + 1, r2);
else
root->right = NULL;
return root;
}
、、、
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int SearchNum(int num,int *array,int length)
{
for(int i=0; i<length; i++)
if(array[i] == num)
return i;
return -1;
//没有找到。
}
struct TreeNode* buildTree(int* pre, int prelen, int* mid, int midlen)
{
struct TreeNode* want;
want=(struct TreeNode*)malloc(sizeof(struct TreeNode));
if(prelen==0&&midlen==0)
return NULL;
want->val=pre[0];
int rootposition=0;
if(pre[0]==mid[0])
want->left=NULL;
else
{
rootposition=SearchNum(want->val,mid,midlen);
want->left=buildTree(pre+1,rootposition,mid,rootposition);
}
if(pre[0]==mid[midlen-1])
want->right=NULL;
else
{
want->right=buildTree(pre+rootposition+1,prelen-rootposition-1,mid+rootposition+1,midlen-rootposition-1);
}
return want;
}
69
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode* lchild, * rchild;
}BiNode, * BiTree;
//逆中序遍历
void printfBiTree(BiTree H, int i)//i表示相对根节点走的步数,层序信息
{
int j;
if (H)
{
printfBiTree(H->rchild, i + 1);//先右
for (j = 1; j < 2 * i; j++)//控制孔哥格数
printf(" ");
printf("%c\n", H->data);
printfBiTree(H->lchild, i + 1);//再左
}
}