首页 > 其他分享 >二叉树

二叉树

时间:2023-11-16 22:57:44浏览次数:33  
标签:right TreeNode data 二叉树 NULL root left

#include <stdio.h>
#include <stdlib.h>

// 二叉树节点的定义
typedef struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

// 创建新节点
TreeNode* createNode(int data) {
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    if (newNode == NULL) {
        printf("内存分配失败\n");
        exit(EXIT_FAILURE);
    }
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}

// 插入节点到二叉搜索树
TreeNode* insert(TreeNode* root, int data) {
    if (root == NULL) {
        return createNode(data);
    }

    if (data < root->data) {
        root->left = insert(root->left, data);
    }
    else if (data > root->data) {
        root->right = insert(root->right, data);
    }

    return root;
}

// 先序遍历
void preOrderTraversal(TreeNode* root) {
    if (root != NULL) {
        printf("%d ", root->data);
        preOrderTraversal(root->left);
        preOrderTraversal(root->right);
    }
}

// 中序遍历
void inOrderTraversal(TreeNode* root) {
    if (root != NULL) {
        inOrderTraversal(root->left);
        printf("%d ", root->data);
        inOrderTraversal(root->right);
    }
}

// 后序遍历
void postOrderTraversal(TreeNode* root) {
    if (root != NULL) {
        postOrderTraversal(root->left);
        postOrderTraversal(root->right);
        printf("%d ", root->data);
    }
}

// 求二叉树的叶子数
int getLeafCount(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }

    if (root->left == NULL && root->right == NULL) {
        return 1; // 叶子节点
    }

    return getLeafCount(root->left) + getLeafCount(root->right);
}

// 求二叉树的深度
int getTreeDepth(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }

    int leftDepth = getTreeDepth(root->left);
    int rightDepth = getTreeDepth(root->right);

    return (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1);
}

// 求二叉树中度为一的节点个数
int getDegreeOneCount(TreeNode* root) {
    if (root == NULL) {
        return 0;
    }

    int degreeOneCount = 0;

    if ((root->left == NULL && root->right != NULL) || (root->left != NULL && root->right == NULL)) {
        // 度为一的节点
        degreeOneCount = 1;
    }

    degreeOneCount += getDegreeOneCount(root->left);
    degreeOneCount += getDegreeOneCount(root->right);

    return degreeOneCount;
}

// 销毁二叉树
void destroyTree(TreeNode* root) {
    if (root != NULL) {
        destroyTree(root->left);
        destroyTree(root->right);
        free(root);
    }
}

int main() {
    TreeNode* root = NULL;

    // 插入节点
    root = insert(root, 5);
    root = insert(root, 3);
    root = insert(root, 7);
    root = insert(root, 2);
    root = insert(root, 4);

    // 先序遍历
    printf("先序遍历结果:");
    preOrderTraversal(root);
    printf("\n");

    // 中序遍历
    printf("中序遍历结果:");
    inOrderTraversal(root);
    printf("\n");

    // 后序遍历
    printf("后序遍历结果:");
    postOrderTraversal(root);
    printf("\n");

    // 求叶子数
    int leafCount = getLeafCount(root);
    printf("叶子数:%d\n", leafCount);

    // 求深度
    int depth = getTreeDepth(root);
    printf("树的深度:%d\n", depth);

    // 求度为一的节点个数
    int degreeOneCount = getDegreeOneCount(root);
    printf("度为一的节点个数:%d\n", degreeOneCount);

    // 销毁二叉树
    destroyTree(root);

    return 0;
}

 

标签:right,TreeNode,data,二叉树,NULL,root,left
From: https://www.cnblogs.com/muzhaodi/p/17837462.html

相关文章

  • LeetCode之二叉树
    发现更多计算机知识,欢迎访问Cr不是铬的个人网站最近数据结构学到二叉树,就刷了刷力扣,写这篇文章也是辅助记忆。103二叉树锯齿形遍历要解出本道题,首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里的输出时一个二维的vector,每一层的值在不同的列表里面......
  • 二叉树初步理解
    二叉树初步:代码如下,注释很详细。#define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstring>#include<stdlib.h>#include<stdio.h>#include<math.h>#include<iomanip>#include<ctype.h>#include<ctime>#inc......
  • 面试必刷TOP101:27、按之字形顺序打印二叉树
    题目题解importjava.util.*;/**publicclassTreeNode{*intval=0;*TreeNodeleft=null;*TreeNoderight=null;*publicTreeNode(intval){*this.val=val;*}*}*/publicclassSolution{/***代码中的类名、方......
  • 二叉树
    1二叉树的定义:每个结点至多只有两棵子树,并且树的子树有左右之分,其次序不能任意颠倒。2性质:二叉树的第i层最多有2^(i-1)个结点。3深度为k的二叉树最多有2^k-1个结点。4任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1.5一个有n个结点的完全二叉树其深度为log以2......
  • 二叉树的前序、中序、后序、层序遍历
    在写遍历函数前,我们需要知道这几种遍历方法的访问结点的顺序。前序遍历:1.先访问根节点。2.再访问左子树。3.最后访问右子树。中序遍历:1.先访问左子树。2.在访问根结点。3.最后访问右子树。后序遍历:1.先访问左子树。2.在访问右子树。3.最后访问根结点。层序遍历:按照......
  • 数据结构之树(树转化为二叉树也叫二叉化)
    说明对于将一般树结构转化为二叉树,使用的方法称为“Child-Sibling”(Leftmost-child-next-right-sibling)法则。步骤1.将节点的所有兄弟节点,用横线连接起来2.删掉所有与子节点间的链接,只保留与最左子节点的链接3.顺时针旋转45度 二叉树转化为多叉树与树转化为二叉树......
  • 面试必刷TOP101:25、二叉树的后序遍历
    题目题解importjava.util.*;/**publicclassTreeNode{*intval=0;*TreeNodeleft=null;*TreeNoderight=null;*publicTreeNode(intval){*this.val=val;*}*}*/publicclassSolution{/***代码中的类名、方......
  • 二叉树(周五实验)
    1#include<iostream>2#include<fstream>3usingnamespacestd;45typedefstructTreeNode6{7chardata;8intlevel;9TreeNode*lchid;10TreeNode*rchid;11}TreeNode;1213chararr[20][2];//存放结......
  • [左神面试指南] 二叉树[上]篇
    CDXXX用递归和非递归方式实现二叉树先序、中序和后序遍历❗publicclassCDbianli_1{publicstaticclassTreeNode{publicintval;publicTreeNodeleft;publicTreeNoderight;publicTreeNode(intnum){......
  • 面试必刷TOP101:24、二叉树的中序遍历
    题目题解深度优先搜索-递归publicclassSolution{/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@paramrootTreeNode类*@returnint整型一维数组*/publicint[]inorderTraversal(TreeNo......