首页 > 其他分享 >树2-二叉树拷贝, 遍历, 计算叶子结点和高度

树2-二叉树拷贝, 遍历, 计算叶子结点和高度

时间:2024-04-18 21:14:46浏览次数:20  
标签:结点 遍历 二叉树 rChild NULL root BinaryNode

树2-二叉树拷贝, 遍历, 计算叶子结点和高度


二叉树结点

typedef struct BinaryNode{
    char ch;
    struct BinaryNode *lChild;
    struct BinaryNode *rChild;
} BinaryNode;
//叶子结点的数量
int sum;

二叉树遍历

前序

//递归遍历(前序)
void Recursion(BinaryNode *root){
    //中左右
    if(root==NULL) return; //root为空return
    cout << root->ch;
    //左子树
    Recursion(root->lChild);
    //右子树
    Recursion(root->rChild);
}

中序

//递归遍历(中序)
void Recursion2(BinaryNode *root){
    if(root==NULL) return; //root为空return
    //先遍历左子树
    Recursion2(root->lChild);
    //再访问遍历根节点
    cout << root->ch;
    //再遍历右子树 
    Recursion2(root->rChild);
}

后序

//递归遍历(后序)
void Recursion3(BinaryNode *root){
    if(root==NULL) return; //root为空return
    //先遍历左子树
    Recursion3(root->lChild);
    //再遍历右子树 
    Recursion3(root->rChild);
    //再访问遍历根节点
    cout << root->ch;
}

求叶子节点的数量

//在成员位置定义一个sum
//求叶子节点的数目(没有子结点)
void CalculateLeafNum(BinaryNode *root){
    if(root==NULL) return;
    if(root->lChild==NULL && root->rChild==NULL){
        sum++;
    };
    //先遍历左子树
    CalculateLeafNum(root->lChild);
    //再遍历右子树 
    CalculateLeafNum(root->rChild);    
}

二叉树拷贝

BinaryNode* CopyBinaryTree(BinaryNode *root){
    if(root==NULL){
        return NULL;
    }
    //拷贝左子树
    BinaryNode *lchild = CopyBinaryTree(root->lChild);
    //拷贝右子树
    BinaryNode *rchild = CopyBinaryTree(root->rChild);

    //创建结点
    BinaryNode *newNode = (BinaryNode*)malloc(sizeof(BinaryNode));
    newNode->ch = root->ch;
    newNode->lChild = lchild;
    newNode->rChild = rchild;
    return newNode;
}

释放二叉树

void FreeSpaceBinaryTree(BinaryNode* root){
    if(root==NULL){
        return;
    }
    //释放左子树
    FreeSpaceBinaryTree(root->lChild);
    //释放右子树 
    FreeSpaceBinaryTree(root->rChild);
    //释放当前结点
    free(root);
}

求二叉树高度

//求二叉树高度
int CalculateTreeDepth(BinaryNode *root){
    if(root==NULL) return 0;
    int depth = 0;
    //求左子树高度
    int leftDepth = CalculateTreeDepth(root->lChild);
    //求右子树高度
    int rightDepth = CalculateTreeDepth(root->rChild);
    //比较高度
    depth = leftDepth>rightDepth ? leftDepth+1 : rightDepth+1;
    return depth;
}


创建二叉树

二叉树结构

void CreateBinaryTree(){
    //创建结点
    BinaryNode node1 = {'A',NULL,NULL};
    BinaryNode node2 = {'B',NULL,NULL};
    BinaryNode node3 = {'C',NULL,NULL};
    BinaryNode node4 = {'D',NULL,NULL};
    BinaryNode node5 = {'E',NULL,NULL};
    BinaryNode node6 = {'F',NULL,NULL};
    BinaryNode node7 = {'G',NULL,NULL};
    BinaryNode node8 = {'H',NULL,NULL};
    //建立结点关系
    node1.lChild = &node2;
    node2.rChild = &node3;
    node3.lChild = &node4;
    node3.rChild = &node5;
    node1.rChild = &node6;
    node6.rChild = &node7;
    node7.rChild = &node8;

    //拷贝二叉树
    BinaryNode *root = CopyBinaryTree(&node1);
    //前序遍历
    cout << "前序遍历: ";
    Recursion(root);
    cout << endl;
    //中序遍历
    cout << "中序遍历: ";
    Recursion2(root);
    cout << endl;
    //后序遍历
    cout << "后序遍历: ";
    Recursion3(root);
    cout << endl;

    //计算叶子结点数量
    CalculateLeafNum(root);
    //求二叉树高度
    int depth = CalculateTreeDepth(root);
    cout << endl;
    cout << "树深度为: " << depth << endl;

    FreeSpaceBinaryTree(root);
}

调用

int main(){
    int sum = 0;
    CreateBinaryTree();
    cout << endl;

    system("pause");
    return 0;
}

标签:结点,遍历,二叉树,rChild,NULL,root,BinaryNode
From: https://www.cnblogs.com/HIK4RU44/p/18144389

相关文章

  • vue3 获取遍历的子组件
    <template><div><!--使用v-for遍历数据,并为每个子组件设置一个ref--><ChildComponentv-for="(item,index)initems":key="index":ref="el=>setChildRef(el,index)"/></div>......
  • 2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。 游戏
    2024-04-17:用go语言,欢迎各位勇者莅临力扣城,本次的挑战游戏名为「力扣泡泡龙」。游戏的起点是一颗形状如二叉树的泡泡树,其中每个节点的值代表该泡泡的分值。勇者们有一次机会可以击破一个节点泡泡,但需要满足以下规则:被击破的节点泡泡最多只能有一个子节点泡泡。如果被击破的节点......
  • VBS遍历文件或文件夹路径输入文件的所有绝对路径(附源码)
    <p>源码如下:</p>FunctionlistFilesPath(filepath)t1=Timer()Debug.WriteLine"****现在开始执行计数,用时:"+CStr(t1)Setfso=CreateObject("scripting.filesystemobject")Setmyfolder=fso.GetFolder(filepath)......
  • JZ27 二叉树的镜像
    /***structTreeNode{* intval;* structTreeNode*left;* structTreeNode*right;* TreeNode(intx):val(x),left(nullptr),right(nullptr){}*};*/classSolution{public:/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回......
  • JZ55 二叉树的深度
    /*structTreeNode{ intval; structTreeNode*left; structTreeNode*right; TreeNode(intx): val(x),left(NULL),right(NULL){ }};*/classSolution{public: //采用递归的方法intTreeDepth(TreeNode*pRoot){ //判空 if(pRoot==NULL) ......
  • 边遍历边统计妙用
    链接:https://ac.nowcoder.com/acm/contest/80259/B来源:牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++262144K,其他语言524288K64bitIOFormat:%lld题目描述小红来到了地下城的一个房间,房间被分成n行m列的格子,小红站在其中一个格子上,她可以向一个方向攻击整条直线......
  • 链表中环的入口结点
       1.先用快慢指针判断是否存在环2.返回快慢指针相遇的地方,一个指针停留在那里。3.另一个指针回到头节点4.两个节点一起走,每次走一格,再次相遇的地方就是入口节点publicclassSolution{    //判断有没有环,返回相遇的地方    publicListNodehasCycle(ListN......
  • 二叉树-层序遍历
    二叉树-层序遍历之前所述二叉树的递归遍历或者迭代遍历都属于深度优先搜索,即先迭代或者递归到树的某一枝最深处再逐渐回退,再到另一支的最深处再逐渐回退,从而完成遍历。而层序遍历属于广度优先遍历,即一层一层去遍历。需要借助队列辅助实现一层一层遍历的逻辑,因为其先进先出的逻辑......
  • 二叉树中序和后序遍历表达式
    什么是二叉树二叉树是一种树形结构,每个节点最多有两个子节点。其中,左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。这种特殊的结构使得二叉树在搜索、排序等方面有着广泛的应用。二叉树的遍历方式二叉树的遍历方式有三种:前序遍历、中序遍历和后序遍历。其中,前......
  • 在python中实现二叉树
    二叉树设计定义节点类classNode:#修改初始化方法definit(self,value):self.value=value#节点值self.left=None#左子树self.right=None#右子树定二叉树类classBinaryTree:#修改初始化方法definit(self,root=None):self.root=root#根节点#定......