[数据结构] 二叉树基础
生活随笔
收集整理的這篇文章主要介紹了
[数据结构] 二叉树基础
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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; }總結
以上是生活随笔為你收集整理的[数据结构] 二叉树基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己实现了一个C语言例程,加深对宏、大小
- 下一篇: ROS学习笔记-ROS语音识别与语音输出