首页 > 编程语言 >【数据结构-树】二叉树的相关算法

【数据结构-树】二叉树的相关算法

时间:2022-12-12 21:33:30浏览次数:55  
标签:lchild 结点 NULL WPL 算法 二叉树 rchild 数据结构

目录

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);

标签:lchild,结点,NULL,WPL,算法,二叉树,rchild,数据结构
From: https://www.cnblogs.com/Mount256/p/16977148.html

相关文章

  • 剑指offer 序列化二叉树
    题目描述请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可......
  • 剑指offer 对称的二叉树(思维)
    题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路:正规的解法是传入两个节点,然后判断它们是不......
  • 温州大学《深度学习》课程课件(六、优化算法)
    这学期我上的另一门课是本科生的《深度学习》,主要用的是吴恩达老师的《深度学习》视频课的内容。使用教材:吴恩达《深度学习》课程笔记课外参考书:《深度学习》,人民邮电出版社......
  • 基础算法学习笔记
    #笔记-基础算法快速排序将序列按从小到大或从大到小顺序排序。时间复杂度\(O(nlogn)\),不稳定。步骤确定分界点\(x\):\(q[l]\)、\(q[(l+r)\div2]\),\(q[r]\)、\(......
  • 算法基础课
    给定一个字符串SS,以及一个模式串PP,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串PP在字符串SS中多次作为子串出现。求出模式串PP在字符串SS中所有......
  • C语言 (数据结构)在顺序表中用二分查找和冒泡排序算法
    main.c:#include<stdio.h>#include<stdlib.h>#include"SequenceList.h"intmain(){//创建顺序表和指针SequenceListSL,*P_SL;intchoice=0;......
  • 优先队列算法
    publicclassBinaryHeap<AnyTypeextendsComparable<?superAnyType>>{privatestaticfinalintDEFAULT_CAPACITY=10;privateintcurrentSize;privat......
  • 算法与数据结构实验四
    实验项目名称:实验四       一、 实验目的1)掌握图的邻接矩阵、邻接表存储结构表示及其创建算法2)掌握图的深度优先搜索遍历算法和图的广度优先搜索遍历算法;3)掌握图......
  • 算法与数据结构实验五 查找
    实验项目名称:实验五    查找  一、 实验目的1.掌握散列表的建立2.掌握散列查找算法的实现。二、 实验内容6-2线性探测法的查找函数试实现线性探测法的查找函......
  • 算法与数据结构实验六 内部排序
    实验项目名称:实验六    内部排序 一、 实验目的1.掌握插入排序的方法及效率分析2.掌握选择排序的方法及效率分析3.掌握交换排序的方法及效率分析4.掌握归并排序的......