二叉树的实现及操作(链表实现)C语言

概述

     二叉树为每个节点最多有两个儿子节点(左儿子节点和右儿子节点)的树。

  前序遍历:根结点 ---> 左子树 ---> 右子树。

  中序遍历:左子树---> 根结点 ---> 右子树。

  后序遍历:左子树 ---> 右子树 ---> 根结点。

  节点深度:节点ni的深度(depth)为从根到ni的唯一路径的长。根的深度为0。

  节点的高:节点ni的高(height)为从ni到一片树叶的最长路径。所有的树叶(没有儿子节点的节点)的高都为0。一棵树的高等于它的根的高。 

二叉树的性质 

1:在二叉树的第i层上最多有2^i-1个节点 
2:深度为K的二叉树之多有2^k-1个节点

注:这里的深度K意思就是有K层的二叉树
3:对于任何一棵二叉树T,如果其终端节点有No个,度为2的节点数有N2,则No=N2+1 
4: 具有n个节点的完全二叉树的深度为[log2n]+1([x]表示不大于x的最大整数)
 

è¿éåå¾çæè¿°

 

#include<stdio.h&g
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
链表实现二叉树是一种常见的数据结构,可以用于存储和操作形结构的数据。下面是C语言链表实现二叉树的方法: 定义结构体: ```c typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; ``` 初始化: ```c TreeNode *root = NULL; ``` 先序遍历创建二叉树方法一: ```c void createTree(TreeNode **node) { int data; scanf("%d", &data); if (data == -1) { *node = NULL; } else { *node = (TreeNode *)malloc(sizeof(TreeNode)); (*node)->data = data; createTree(&((*node)->left)); createTree(&((*node)->right))); } } ``` 测试: ```c int main() { createTree(&root); return 0; } ``` 方法二:根据所给的字符串序列创建 ```c void createTree(TreeNode **node, char *str, int *index) { if (str[*index] == '\0' || str[*index] == '#') { *node = NULL; (*index)++; } else { *node = (TreeNode *)malloc(sizeof(TreeNode)); (*node)->data = str[*index] - '0'; (*index)++; createTree(&((*node)->left), str, index); createTree(&((*node)->right), str, index); } } ``` 其他方法: - 的结点大小 ```c int size(TreeNode *node) { if (node == NULL) { return 0; } else { return size(node->left) + 1 + size(node->right); } } ``` - 的高 ```c int height(TreeNode *node) { if (node == NULL) { return 0; } else { int leftHeight = height(node->left); int rightHeight = height(node->right); return (leftHeight > rightHeight) ? (leftHeight + 1) : (rightHeight + 1); } } ``` - 判断是否为空 ```c int isEmpty(TreeNode *node) { return node == NULL; } ``` - 找某个结点的左孩子和右孩子 ```c TreeNode *leftChild(TreeNode *node) { if (node == NULL) { return NULL; } else { return node->left; } } TreeNode *rightChild(TreeNode *node) { if (node == NULL) { return NULL; } else { return node->right; } } ``` - 找某个结点的父节点 ```c TreeNode *parent(TreeNode *root, TreeNode *node) { if (root == NULL || root == node) { return NULL; } else if (root->left == node || root->right == node) { return root; } else { TreeNode *p = parent(root->left, node); if (p != NULL) { return p; } else { return parent(root->right, node); } } } ``` - 查找元素 ```c TreeNode *find(TreeNode *node, int data) { if (node == NULL) { return NULL; } else if (node->data == data) { return node; } else { TreeNode *p = find(node->left, data); if (p != NULL) { return p; } else { return find(node->right, data); } } } ``` - 拷贝 ```c TreeNode *copy(TreeNode *node) { if (node == NULL) { return NULL; } else { TreeNode *newNode = (TreeNode *)malloc(sizeof(TreeNode)); newNode->data = node->data; newNode->left = copy(node->left); newNode->right = copy(node->right); return newNode; } } ``` - 清空 ```c void clear(TreeNode **node) { if (*node != NULL) { clear(&((*node)->left)); clear(&((*node)->right)); free(*node); *node = NULL; } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值