数据结构与算法基础(王卓)(20):二叉遍历思想的应用(二叉树的建立(DLR先序遍历,递归算法)、二叉树的复制、求二叉树的深度、求二叉树的结点数、求二叉树的叶子结点数)及线索二叉树

目录

应用操作汇总: 

前置条件:

创建二叉树:

嵌套:

二叉树的复制

求二叉树的深度(以下几个算法有点难度,多看看)

求二叉树的结点数

求二叉树的叶子结点数

线索二叉树


应用操作汇总: 

二叉树的建立(DLR先序遍历,递归算法)

二叉树的复制

求二叉树的深度

求二叉树的结点数
求二叉树的叶子结点数

自己多动手写写吧(记住要手撸默写哦) 


前置条件:

#include<iostream>
using namespace std;
 
typedef int Status;
#define MAXTSIZE 100
 
typedef char TElemtype;//Tree Elemtype
//根据需求情况修改
typedef TElemtype SqBiTree;//sequence binary tree
//binary:二进制的; 二元的; 由两部分组成的;
SqBiTree bt;//binary tree
 
struct BiNode//二叉链表存储结构
{
	TElemtype data;
	struct
		BiNode* lchild, * rchild;
	//左右孩子指针
};
typedef BiNode * BiTree;
 
struct TriNode//trinary:三元的
{
	TElemtype data;
	struct
		BiNode* lchild, * rchild,* parent;
};
typedef TriNode* TriTree;
 
int main()
{
 
}

创建二叉树:

Status CreatBiTree(BiTree& T)
{
    char input;
    cin >> input;
    if (input == '#')
        return false;
    T = new BiNode;  
    T->data = input;//D
    CreatBiTree(T->lchild);//L
      //嵌套
    CreatBiTree(T->rchild);//R
      //嵌套
    return true;
}

嵌套:

调用没有执行完就又套用了一层调用
里面套的下一层调用执行完毕了以后
程序再返回到前面开始写这个嵌套(套娃)的语句之后
继续往下执行

二叉树的复制

int Copy(BiTree T, BiTree& NewT)
{
    if (T == NULL)
    {
        NewT = NULL;
        return 0;
    }
    else
    {
        NewT = new BiNode;
        NewT->data = T->data;
        Copy(T->lchild, NewT->lchild);
        Copy(T->rchild, NewT->rchild);
    }
    return 1;
}

&表示返回传递??不是形参实参和指针都能表示返回传递吗


求二叉树的深度(以下几个算法有点难度,多看看)

int Depth(BiTree& T)
{
    if (T == NULL)
        return 0;
    else
    {
        int m = Depth(T->lchild);
        int n = Depth(T->rchild);
        if (m > n)
            return m + 1;
        else
            return n + 1;
    }
}

二叉树 = 根结点+左子树+右子树;

右子树 = 根结点+左子树+右子树

左子树 = 根结点+左子树+右子树......如此循环反复

思想:嵌套思想,第一性原理(拆解简化实现完成不可能的功能)

把一个复杂二叉树的运算求解问题

分解成一个个的单结点二叉树(叶子结点)问题的累加(用递归函数一层层分解二叉树)


求二叉树的结点数

int NodeCount(BiTree T)//有点难度,多看看
{
    if (T == NULL)
        return 0;
    else
        return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}


求二叉树的叶子结点数

int LeafNodeCount(BiTree T)
{
    if (T == NULL)
        return 0;
    if (T->lchild == NULL && T->rchild == NULL)
        return 1;
    else
        return LeafNodeCount(T->lchild) + LeafNodeCount(T->rchild);
}

线索二叉树

结构定义:

struct BiThrNode
	//Threaded binary tree:线索二叉树
{
	int data;
	int ltag, rtag;
	struct BiTrNode* lchild, * rchild;
};
typedef BiThrNode * BiThrTree;

thread:

有螺纹的;穿(针);(使)穿过; 通过; 穿行; 穿成串; 串在一起

猜你喜欢

转载自blog.csdn.net/Zz_zzzzzzz__/article/details/129740137