当前位置: 首页 > backend >正文

数据结构——二叉树

目录

二叉树基础知识:

二叉树的结论:

二叉树的遍历:

先序:

中序:

后序:

基于二叉树遍历的其他操作:

统计结点个数:

统计叶子个数:

统计度为一节点个数:

统计度为二节点个数:

求二叉树深度:

1:

2:

从下往上打印指定元素的所有祖先:

二叉树的层次遍历:

层次输出第n个结点:

二叉树的建立:

已知空树:

直接返回树版:

 c++引用返回树版(提前建立树,然后通过函数来改变树):

先序+中序:

后序+中序:


二叉树基础知识:

二叉树的结论:

二叉树的遍历:

先序:

中序:

后序:

基于二叉树遍历的其他操作:

统计结点个数:
统计叶子个数:
统计度为一节点个数:
统计度为二节点个数:
求二叉树深度:
1:
2:
从下往上打印指定元素的所有祖先:
二叉树的层次遍历:
层次输出第n个结点:

二叉树的建立:

已知空树:

直接返回树版:
#include <stdio.h>
#include <stdlib.h>typedef char ElementType;
typedef struct BiTNode{ElementType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;BiTree CreatBinTree();
void  preorder( BiTree T );int main()
{BiTree T = CreatBinTree();preorder(  T );return 0;
}
void  preorder( BiTree T )
{if(T){printf("%c",T->data);preorder(T->lchild);preorder(T->rchild);}
}
BiTree CreatBinTree()
{char ch;BiTree T;scanf("%c",&ch);if(ch=='#') return NULL;T=(BiTree)malloc(sizeof(BiTNode));T->data=ch;T->lchild=CreatBinTree();T->rchild=CreatBinTree();return T;
}
 c++引用返回树版(提前建立树,然后通过函数来改变树):
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct BiTNode{ElementType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;void CreatBinTree(BiTree  &T);
void preorder( BiTree T );int main()
{BiTree T;CreatBinTree(T);preorder(  T );return 0;
}
void preorder( BiTree T )
{if(T){printf("%c",T->data);preorder(T->lchild);preorder(T->rchild);}
}
void CreatBinTree(BiTree &T)
{char ch;scanf("%c",&ch);if(ch=='#')  T=NULL;else{(BiTree)malloc(sizeof(BiTNode));T->data=ch;CreatBinTree( T->lchild);CreatBinTree( T->rchild);}
}

 c语言指针版(和引用版底层逻辑一样,只不过c语言更呆):

#include <stdio.h>
#include <stdlib.h>typedef char ElementType;
typedef struct BiTNode{ElementType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;void CreatBinTree(BiTree  *T);
void preorder( BiTree T );int main()
{BiTree T;CreatBinTree(&T);preorder(  T );return 0;
}
void preorder( BiTree T )
{if(T){printf("%c",T->data);preorder(T->lchild);preorder(T->rchild);}
}
void CreatBinTree(BiTree  *T)
{char ch;scanf("%c",&ch);if(ch=='#')  *T=NULL;else{*T=(BiTree)malloc(sizeof(BiTNode));(*T)->data=ch;CreatBinTree( &(*T)->lchilde);注意一下优先级->的优先级高于*,所以给*加()CreatBinTree( &(*T)->rchilde);}
}

除了已知空树的情况外,如果我们已知先序+中序或者后序加中序那么我们也可以唯一确定一棵树。

先序+中序:

先序是跟左右进行遍历,所以我们一定可以确定根节点是什么;

记录当前根节点,然后在中序数组中寻找根节点的位置,并记录这个位置;

因为中序是左根右进行遍历,所以根节点左边的都是左树,右边的都是右树;

递归进行除了左树和右数即可;

注意:1:creat函数的返回值是BiTree类型,最后要返回T;

           2:递归不用想太多,只想一层的效果即可,往后每一层都是如此操作,直至最终到边界

(其实递归所传参数就是对应数组的起始位置以及数组长度,寻找位置传参即可,具体看代码后的图片,图片和代码结合着看) 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElementType;
typedef struct BiTNode{ElementType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;BiTree CreatBinTree(char *pre,char *in,int n );
void postorder( BiTree T );int main()
{BiTree T;char prelist[100];char inlist[100];int length;scanf("%s",prelist);scanf("%s",inlist);length=strlen(prelist);T=CreatBinTree(prelist,inlist, length);postorder(  T );return 0;
}
void  postorder( BiTree T )//后序输出二叉树
{if(T){postorder(T->lchild);postorder(T->rchild);printf("%c",T->data);}
}
BiTree CreatBinTree(char *pre,char *in,int n)
pre是先序数组,in是中序数组,n是树的节点数
随着递归的深入,先序数组和中序数组会不断缩小,直至节点个数<=0,递归结束
{BiTree T;int i;if(n<=0) return NULL;T=(BiTree)malloc(sizeof(BiTNode));T->data=pre[0];记录根节点for(i=0;in[i]!=pre[0];i++);寻找根节点的位置T->lchild=CreatBinTree(pre+1,in,i);//递归左树T->rchild=CreatBinTree(pre+i+1,in+1+i,n-i-1);//递归右树return T;
}

 

后序+中序:

思路和先序+中序差不多,都是寻找根节点,然后递归左树和右树;

不同的是后序是左右根遍历,所以根节点在最后面;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElementType;
typedef struct BiTNode{ElementType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;BiTree CreatBinTree(char *post,char*in,int n);
void preorder( BiTree T );int main()
{BiTree T;char postlist[100];char inlist[100];int length;scanf("%s",postlist);scanf("%s",inlist);length=strlen(postlist);T=CreatBinTree(postlist,inlist, length);preorder(  T );return 0;
}
void  preorder( BiTree T )
{if(T){printf("%c",T->data);preorder(T->lchild);preorder(T->rchild);}
}
BiTree CreatBinTree(char *post,char*in,int n )
post是后序数组,in是中序数组,n是树的节点数
随着递归的深入,后序数组和中序数组会不断缩小,直至节点个数<=0,递归结束
{BiTree T;int i;if(n<=0) return NULL;T=(BiTree)malloc(sizeof(BiTNode));T->data=post[n-1];记录根节点for(i=0;in[i]!=post[n-1];i++);寻找根节点的位置T->lchild=CreatBinTree(post,in,i);递归左树T->rchild=CreatBinTree(post+i,in+1+i,n-i-1);递归右树return T;
}

 尚未完结。

http://www.xdnf.cn/news/90.html

相关文章:

  • GB28181的SIP注册与PS推流学习
  • 常用绑定事件方式有哪几种
  • Spring AI与通义千问的完美结合:构建智能对话应用
  • 【OSG学习笔记】Day 3: 加载你的第一个3D模型
  • C++每日训练 Day 16:构建 GUI 响应式信号机制(面向初学者)
  • Linux 文件传输:系统数据交互的动脉
  • 【Leetcode 每日一题 - 补卡】2537. 统计好子数组的数目
  • Flink-01学习 介绍Flink及上手小项目之词频统计
  • GPT对话UI--通义千问API
  • Linux 权限
  • 2025.4.17学习日记 初识JavaScript 以及Java和JavaScript有什么区别
  • 什么是分布式锁?
  • Linux: 生产者消费者模型
  • 从零开始学A2A四:A2A 协议的安全性与多模态支持
  • 多个路由器互通(静态路由)无单臂路由(简单版)
  • STM32 时钟树
  • TCP连接建立:为什么是三次握手?
  • 正则表达式在爬虫中的应用:匹配 HTML 和 JSON 的技巧
  • 操作教程|通过DataEase制作MaxKB系统数据大屏
  • QML之Overlay
  • R4打卡——pytorch实现LSTM预测火灾
  • 《vue3学习手记4》
  • openai发布今天发布了o3和o4-mini。
  • Vue 3 reactive 和 ref 区别及 失去响应性问题
  • 大数据常见的模型定义及应用场景建议╮(╯▽╰)╭
  • 深入理解常见排序算法:从原理到实践
  • 视频剪辑入门
  • 深入了解v-model的原理:v-model拆分为value属性和input事件,表单类组件的封装并用v-model简化代码
  • 是德科技E5080B网络分析仪深度评测:5G/车载雷达测试实战指南
  • 零基础上手Python数据分析 (16):DataFrame 常用统计分析方法