Python实现
"""Pre-order, in-order and post-order traversal of binary trees.Author: Wenru Dong
"""
from typing import TypeVar, Generic, Generator, OptionalT = TypeVar("T")class TreeNode(Generic[T]):def __init__(self, value: T):self.val = valueself.left = Noneself.right = None# Pre-order traversal
def pre_order(root: Optional[TreeNode[T]]) -> Generator[T, None, None]:if root:yield root.valyield from pre_order(root.left)yield from pre_order(root.right)# In-order traversal
def in_order(root: Optional[TreeNode[T]]) -> Generator[T, None, None]:if root:yield from in_order(root.left)yield root.valyield from in_order(root.right)# Post-order traversal
def post_order(root: Optional[TreeNode[T]]) -> Generator[T, None, None]:if root:yield from post_order(root.left)yield from post_order(root.right)yield root.valif __name__ == "__main__":singer = TreeNode("Taylor Swift")genre_country = TreeNode("Country")genre_pop = TreeNode("Pop")album_fearless = TreeNode("Fearless")album_red = TreeNode("Red")album_1989 = TreeNode("1989")album_reputation = TreeNode("Reputation")song_ls = TreeNode("Love Story")song_wh = TreeNode("White Horse")song_wanegbt = TreeNode("We Are Never Ever Getting Back Together")song_ikywt = TreeNode("I Knew You Were Trouble")song_sio = TreeNode("Shake It Off")song_bb = TreeNode("Bad Blood")song_lwymmd = TreeNode("Look What You Made Me Do")song_g = TreeNode("Gorgeous")singer.left, singer.right = genre_country, genre_popgenre_country.left, genre_country.right = album_fearless, album_redgenre_pop.left, genre_pop.right = album_1989, album_reputationalbum_fearless.left, album_fearless.right = song_ls, song_whalbum_red.left, album_red.right = song_wanegbt, song_ikywtalbum_1989.left, album_1989.right = song_sio, song_bbalbum_reputation.left, album_reputation.right = song_lwymmd, song_gprint(list(pre_order(singer)))print(list(in_order(singer)))print(list(post_order(singer)))
java实现
public class BinarySearchTree {private Node tree;public Node find(int data) {Node p = tree;while (p != null) {if (data < p.data) p = p.left;else if (data > p.data) p = p.right;else return p;}return null;}public void insert(int data) {if (tree == null) {tree = new Node(data);return;}Node p = tree;while (p != null) {if (data > p.data) {if (p.right == null) {p.right = new Node(data);return;}p = p.right;} else { // data < p.dataif (p.left == null) {p.left = new Node(data);return;}p = p.left;}}}public void delete(int data) {Node p = tree; // p指向要删除的节点,初始化指向根节点Node pp = null; // pp记录的是p的父节点while (p != null && p.data != data) {pp = p;if (data > p.data) p = p.right;else p = p.left;}if (p == null) return; // 没有找到// 要删除的节点有两个子节点if (p.left != null && p.right != null) { // 查找右子树中最小节点Node minP = p.right;Node minPP = p; // minPP表示minP的父节点while (minP.left != null) {minPP = minP;minP = minP.left;}p.data = minP.data; // 将minP的数据替换到p中p = minP; // 下面就变成了删除minP了pp = minPP;}// 删除节点是叶子节点或者仅有一个子节点Node child; // p的子节点if (p.left != null) child = p.left;else if (p.right != null) child = p.right;else child = null;if (pp == null) tree = child; // 删除的是根节点else if (pp.left == p) pp.left = child;else pp.right = child;}public Node findMin() {if (tree == null) return null;Node p = tree;while (p.left != null) {p = p.left;}return p;}public Node findMax() {if (tree == null) return null;Node p = tree;while (p.right != null) {p = p.right;}return p;}public static class Node {private int data;private Node left;private Node right;public Node(int data) {this.data = data;}}
}
C++实现
/*************************************************************************> Author: > Mail:    > Time:    2020-08-22> Desc:    二叉搜索树实现************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char ElemType;typedef struct node {ElemType data;struct node *lchild, *rchild;
} BTree, *BTreePtr;/**************** 插入 **********************/
Status Insert(BTreePtr *T, ElemType e) {BTreePtr p;if (*T == NULL) {*T = (BTreePtr)malloc(sizeof(BTree));(*T)->data = e;return TRUE;} else {p = *T;while ( p != NULL) {if (e > p->data) {if (p->rchild == NULL) {p->rchild = (BTreePtr) malloc (sizeof(BTree));p->rchild->data = e;return TRUE;}p = p->rchild;} else {if (p->lchild == NULL){p->lchild = (BTreePtr) malloc (sizeof(BTree));p->lchild->data = e;return TRUE;}p = p->lchild;}}}return FALSE;
}/**************** 删除 **********************/
Status Delete(BTreePtr T, ElemType e) {BTreePtr p, pp, minP, minPP, child;child = NULL;p = T;pp = NULL;while ( (p != NULL) && (p->data != e) ) {pp = p;if (e > p->data) {p = p->rchild;} else {p = p->lchild;}}if (p == NULL) return FALSE;//双节点if ((p->lchild != NULL) && (p->rchild != NULL)){minPP = p;minP = p->rchild;while (minP->lchild != NULL) {minPP = minP;minP = minP->lchild;}p->data = minP->data;minPP->lchild = minP->rchild;free(minP);return TRUE;}//有一个节点if ((p->lchild != NULL) || (p->rchild != NULL)) { //应该将原有的pp同child连接在一起if (p->lchild) {child = p->lchild;} else {child = p->rchild;}if(pp->data>p->data){pp->lchild=child;} else{pp->rchild=child;}free(p);return TRUE;}//没有节点if (pp->lchild == p) {//这里面临pp除p以外的节点为null的情况pp->lchild = child;} else {pp->rchild = child;}return TRUE;
}/**************** 查找 **********************/Status Find(BTreePtr T, ElemType e) {if (T == NULL) return FALSE;while ((T != NULL) && (T->data != e)) {if (e > T->data) {T = T->rchild;} else {T = T->lchild;}}if (T) {return TRUE;} else {return FALSE;}
}/**************** 最大值 **********************/
ElemType FindMax(BTreePtr T) {ElemType max;while(T != NULL) {max = T->data;T = T->rchild;}return max;
}/**************** 最小值 **********************/
ElemType FindMin(BTreePtr T) {ElemType min;while(T != NULL) {min = T->data;T = T->lchild;}return min;
}void PreOrderTraverse(BTreePtr T)//前序遍历二叉树
{if (T == NULL) return;if(T){printf("%d ",T->data);PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}
}void DestroyTree(BTreePtr T) {if (T){if (T->lchild){DestroyTree(T->lchild);}if(T->rchild){DestroyTree(T->rchild);}free(T);T = NULL;}
}/***************** 执行测试 *************************/
int main(int argc, char const *argv[])
{BTreePtr T;T = NULL;int a[] = {33, 16, 50, 13, 18, 34, 58, 15, 17, 25, 51, 66, 19, 27, 55};int i;for (i = 0; i < 15; i++) {Insert(&T, a[i]);}printf("Max is %d\n", FindMax(T));printf("Min is %d\n", FindMin(T));Delete(T, 18);Delete(T, 13);PreOrderTraverse(T);DestroyTree(T);return 0;
}

[数据结构] 二叉树基础相关推荐

  1. 43. 盘点那些必问的数据结构算法题之二叉树基础

    盘点那些必问的数据结构算法题之二叉树基础 0 概述 1 定义 2 基本操作 1) 创建结点 2) BST 插入结点 3) BST 删除结点 4) BST 查找结点 5)BST 最小值结点和最大值结点 ...

  2. 【数据结构】基础:二叉树

    [数据结构]基础:二叉树基础 摘要:本文将会介绍二叉树的基础内容,首先引入树的概念,了解树的基本概念与性质,再对二叉树的概念和性质进行分析,最后对其方法进行实现,最重要的是理解对于二叉树方法实现的分治 ...

  3. 数据结构——二叉树的遍历

    "树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点 ...

  4. 数据结构——二叉树总结

    数据结构-二叉树总结 写在前面 二叉树遍历 递归实现先.中.后序遍历 非递归遍历 先序非递归 中序非递归 后序非递归 层次遍历 二叉树还原 先序中序建树 后序中序建树 层次中序建树 二叉树应用 二叉查 ...

  5. 3. 数据结构--二叉树 BST AVL树 Huffman

    数据结构–二叉树 KEY:(不敢相信没有堆-) 二叉树的定义及其主要特征 ☑️ 二叉树的顺序存储结构和链式存储结构实现 二叉树的遍历及应用 二叉排序(查找.检索)树 (BST) 平衡的二叉检索树- A ...

  6. 数据结构 -- 二叉树

          这篇文章介绍的是经典的数据结构--二叉树,在这篇文章里介绍了几乎二叉树的所有操作.       二叉树给我们最重要的印象莫过于递归,因为这棵树就是递归的,所以,我在解决各个问题时大部分都用 ...

  7. 数据结构 - 二叉树 - 面试中常见的二叉树算法题

    数据结构 - 二叉树 - 面试中常见的二叉树算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图 ...

  8. 算法——常用的数据结构/模板/基础知识

    常用的数据结构/模板/基础知识 (一)c++--优先队列(priority_queue) 最大堆和最小堆的写法 (二)c++中的全排列函数next_permutation() (三)迭代器的使用 (四 ...

  9. 数据结构——二叉树的递归算法

    二叉树的结构定义: typedef struct BiNode {TElemType data;struct BiNode *lchild;struct BiNode *rchild; }BiNode ...

最新文章

  1. mysql 5.6 gtid mha_MySQL MHA--故障切换模式(GTID模式和非GTID模式)
  2. windows mysql提示:1045 access denied for user 'root'@'localhost' using password yes 解决方案
  3. 小程序向Java传值,微信小程序 页面传值详解
  4. Python 生成器与列表解析
  5. 卷文件系统根目录仅剩余0字节_Linux Ext4文件系统的老祖宗长什么样
  6. C-Power 自主无人海上电力系统有望通过高效能源传输及远程高带宽通信技术,开启新的海上应用
  7. 第八周PLC编程练习
  8. win访问linux NFS磁盘映射共享驱动器卡顿
  9. CTFshow-大牛杯
  10. java sqlldr_sqlldr使用(转)
  11. android自动画廊,Android3D画廊效果与自动轮播Banner
  12. 单相Boost功率因数校正电路(PFC)设计与仿真(Simulink Saber):第二章 仿真模型搭建与控制参数整定
  13. [历年IT笔试题]2014微软校园招聘笔试试题
  14. TS中的方法重载,函数重载,构造器重载
  15. Gym - 100889H Hitting Points 计算几何+三分+二分
  16. 使用EasyExcel从Excel表格读取链接地址下载文件
  17. NETDMIS5.0手动测量——智能识别2023
  18. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法
  19. vue中axios利用blob实现文件浏览器下载
  20. 使用贷款基础利率LPR购房

热门文章

  1. C# Winform验证码
  2. 大连.Net俱乐部已经加入INETA
  3. java 是否继续操作?代码
  4. 逻辑漏洞-token绕过
  5. 在利用计算机生成,计算机生成人像,从而使人脸的模糊变为现实
  6. [Python学习] 专题三.字符串的基础知识
  7. iOS之深入解析如何使用Block实现委托方法
  8. LeetCode Algorithm 797. 所有可能的路径
  9. 974. Subarray Sums Divisible by K
  10. Go 语言编写 CPython 扩展 goPy