数据结构-树二叉树的相关算法
Posted Mount256
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-树二叉树的相关算法相关的知识,希望对你有一定的参考价值。
文章目录
1 计算二叉树中双分支结点的个数
假设二叉树采用二叉链表存储,试设计一个算法,计算一棵给定二叉树的所有双分支结点个数。
int count = 0;
void Degree2 (BiTree T)
if (T != NULL)
Degree2(T->lchild);
Degree2(T->rchild);
if ((T->lchild != NULL) && (T->rchild != NULL))
count++;
2 交换二叉树中所有左右子树
编写一个把树 B 中所有结点的左、右子树进行交换的函数。
void SwapNodeChild (BiTree T)
if (T->lchild != NULL)
SwapNodeChild(T->lchild);
if (T->rchild != NULL)
SwapNodeChild(T->rchild);
Swap(T->lchild, T->rchild);
3 求先序遍历第 k 个元素
设计一个算法,求先序遍历序列中第 k 个结点的值。
int i = 1;
int PreOrder (BiTree T, int k)
if (T != NULL)
if (i == k)
return T->data;
i++;
PreOrder(T->lchild, k);
PreOrder(T->rchild, k);
4 删去值为 x 的子树
对于树中每个元素值为 x 的结点,删去以它为根的子树,并释放相应的空间。
void Delete (BiTree T) // 找到元素值为 x 的结点后,递归删去它的左子树和右子树
if (T != NULL)
Delete(T->lchild);
Delete(T->rchild);
free(T);
void Find (BiTree T, int x)
if (T != NULL)
if (T->data == x) // 若找到元素值为 x 的结点
Delete(T); // 开始递归删去它的左子树和右子树
return;
else // 若不是元素值为 x 的结点
Find(T->lchild, x); // 继续找左子树中有无元素值为 x 的结点
Find(T->rchild, x); // 继续找右子树中有无元素值为 x 的结点
5 计算二叉树的带权路径长度(WPL)
二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树 T,采用二叉链表存储结点结构为
left | weight | right |
---|---|---|
左子树指针域 | 权值 | 右子树指针域 |
其中叶结点的 weight 域保存该结点的非负权值,设 root 为指向 T 的根结点的指针,请设计求 T 的 WPL 的算法。
算法的核心思想是先序遍历 + 计算层数,代码如下:
int WPL;
void WPL_PreOrder (BiTree T, int level)
if (T != NULL)
if ((T->lchild != NULL) && (T->rchild != NULL))
WPL = WPL + T->weight * level;
else if ((T->lchild != NULL) && (T->rchild == NULL))
WPL_PreOrder(T->lchild, level + 1);
else
WPL_PreOrder(T->rchild, level + 1);
// main 函数中调用:
WPL_PreOrder(Tree, 0);
6 将表达式树转化为等价的中缀表达式
请设计一个算法,将给定的表达式树,转换成等价的中缀表达式并输出。
二叉树结点定义如下:
typedef struct node
char data[10];
struct node *left, * right;
BTree;
算法的核心思想是中序遍历 + 计算层数。可以先将中序遍历的表达式先写出来,再与加了括号的表达式对比一下,看看哪个地方加了括号。遍历左子树前加上左括号,遍历完右子树后加上右括号,根结点(表达式最外层)和叶结点(操作数)不需要加括号。代码如下:
void InOrder (BTree *T, int level)
if (T != NULL)
if ((T->left == NULL) && (T->right == NULL)) // 叶结点
输出 T->data; // 输出操作数
else
if (level > 1) // 若有子表达式则加 1 层括号
输出 "(";
InOrder(T->left, level + 1);
输出 T->data; // 输出操作符
InOrder(T->right, level + 1);
if (level > 1) // 若有子表达式则加 1 层括号
输出 ")";
// main 函数中调用:
InOrder(Tree, 0);
以上是关于数据结构-树二叉树的相关算法的主要内容,如果未能解决你的问题,请参考以下文章