二叉查找树的插入

合集下载

搜索树的基本操作方法

搜索树的基本操作方法

搜索树的基本操作方法
搜索树是一种有序的二叉树数据结构,常用于存储和搜索数据。

基本的操作方法包括插入、删除和查找。

1. 插入操作(insert):向搜索树中插入新节点。

从根节点开始遍历搜索树,如果待插入节点值小于当前节点值,则继续向左子树搜索;如果待插入节点值大于当前节点值,则继续向右子树搜索;直到找到一个空位置,将待插入节点插入到该位置。

2. 删除操作(delete):删除指定节点。

先在搜索树中找到待删除节点,根据不同情况进行处理:
a) 如果待删除节点没有子节点,直接删除它。

b) 如果待删除节点只有一个子节点,将子节点替代待删除节点的位置。

c) 如果待删除节点有两个子节点,则寻找待删除节点的前驱节点或后继节点来替代该节点。

前驱节点是指比待删除节点值小的最大节点,后继节点是指比待删除节点值大的最小节点。

可以选择使用前驱节点或后继节点来替代待删除节点。

3. 查找操作(search):在搜索树中查找指定值的节点。

从根节点开始遍历搜索树,如果要查找的值等于当前节点值,则返回该节点;如果要查找的值小于当前节点值,则继续向左子树搜索;如果要查找的值大于当前节点值,则继续向右子树搜索。

如果找到了匹配节点,则返回节点;如果搜索到空节点(未找到匹配节点),则返回空值。

以上是搜索树的基本操作方法,对于不同的搜索树实现,可能会有一些其他特定的操作方法。

二叉树的基本操作

二叉树的基本操作

二叉树的基本操作二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点。

二叉树在计算机领域中得到广泛应用,它的基本操作包括插入、删除、查找、遍历等。

1.插入操作:二叉树的插入操作是将一个新的节点添加到已有的二叉树中的过程。

插入操作会按照一定规则将新节点放置在正确的位置上。

插入操作的具体步骤如下:-首先,从根节点开始,比较新节点的值与当前节点的值的大小关系。

-如果新节点的值小于当前节点的值,则将新节点插入到当前节点的左子树中。

-如果新节点的值大于当前节点的值,则将新节点插入到当前节点的右子树中。

-如果当前节点的左子树或右子树为空,则直接将新节点插入到该位置上。

-如果当前节点的左子树和右子树都不为空,则递归地对左子树或右子树进行插入操作。

2.删除操作:二叉树的删除操作是将指定节点从二叉树中删除的过程。

删除操作有以下几种情况需要考虑:-如果待删除节点是叶子节点,则直接将其从二叉树中删除即可。

-如果待删除节点只有一个子节点,则将其子节点替换为待删除节点的位置即可。

-如果待删除节点有两个子节点,则需要找到其左子树或右子树中的最大节点或最小节点,将其值替换为待删除节点的值,然后再删除最大节点或最小节点。

3.查找操作:二叉树的查找操作是在二叉树中查找指定值的节点的过程。

查找操作的具体步骤如下:-从根节点开始,将待查找值与当前节点的值进行比较。

-如果待查找值等于当前节点的值,则返回该节点。

-如果待查找值小于当前节点的值,则在当前节点的左子树中继续查找。

-如果待查找值大于当前节点的值,则在当前节点的右子树中继续查找。

-如果左子树或右子树为空,则说明在二叉树中找不到该值。

4.遍历操作:二叉树的遍历操作是按照一定规则依次访问二叉树中的每个节点。

有三种常用的遍历方式:- 前序遍历(Preorder Traversal):先访问根节点,然后递归地前序遍历左子树和右子树。

- 中序遍历(Inorder Traversal):先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。

二叉树的建立与基本操作

二叉树的建立与基本操作

二叉树的建立与基本操作二叉树是一种特殊的树形结构,它由节点(node)组成,每个节点最多有两个子节点。

二叉树的基本操作包括建立二叉树、遍历二叉树、查找二叉树节点、插入和删除节点等。

本文将详细介绍二叉树的建立和基本操作,并给出相应的代码示例。

一、建立二叉树建立二叉树有多种方法,包括使用数组、链表和前序、中序、后序遍历等。

下面以使用链表的方式来建立二叉树为例。

1.定义二叉树节点类首先,定义一个二叉树节点的类,包含节点值、左子节点和右子节点三个属性。

```pythonclass Node:def __init__(self, value):self.value = valueself.left = Noneself.right = None```2.建立二叉树使用递归的方法来建立二叉树,先构造根节点,然后递归地构造左子树和右子树。

```pythondef build_binary_tree(lst):if not lst: # 如果 lst 为空,则返回 Nonereturn Nonemid = len(lst) // 2 # 取 lst 的中间元素作为根节点的值root = Node(lst[mid])root.left = build_binary_tree(lst[:mid]) # 递归构造左子树root.right = build_binary_tree(lst[mid+1:]) # 递归构造右子树return root```下面是建立二叉树的示例代码:```pythonlst = [1, 2, 3, 4, 5, 6, 7]root = build_binary_tree(lst)```二、遍历二叉树遍历二叉树是指按照其中一规则访问二叉树的所有节点,常见的遍历方式有前序遍历、中序遍历和后序遍历。

1.前序遍历前序遍历是指先访问根节点,然后访问左子节点,最后访问右子节点。

```pythondef pre_order_traversal(root):if root:print(root.value) # 先访问根节点pre_order_traversal(root.left) # 递归访问左子树pre_order_traversal(root.right) # 递归访问右子树```2.中序遍历中序遍历是指先访问左子节点,然后访问根节点,最后访问右子节点。

二叉树知识点总结

二叉树知识点总结

二叉树知识点总结1. 二叉树的性质1.1 二叉树的性质一:二叉树的深度二叉树的深度是指从根节点到叶子节点的最长路径长度。

对于一个空树而言,它的深度为0;对于只有一个根节点的树而言,它的深度为1。

根据定义可知,深度为k的二叉树中,叶子节点的深度值为k。

由此可知,二叉树的深度为所有叶子节点深度的最大值。

1.2 二叉树的性质二:二叉树的高度二叉树的高度是指从根节点到叶子节点的最短路径长度。

对于一个空树而言,它的高度为0;对于只有一个根节点的树而言,它的高度为1。

由此可知,二叉树的高度总是比深度大一。

1.3 二叉树的性质三:二叉树的节点数量对于一个深度为k的二叉树而言,它最多包含2^k - 1个节点。

而对于一个拥有n个节点的二叉树而言,它的深度最多为log2(n+1)。

1.4 二叉树的性质四:满二叉树满二叉树是一种特殊类型的二叉树,它的每个节点要么是叶子节点,要么拥有两个子节点。

满二叉树的性质是:对于深度为k的满二叉树而言,它的节点数量一定是2^k - 1。

1.5 二叉树的性质五:完全二叉树完全二叉树是一种特殊类型的二叉树,它的所有叶子节点都集中在树的最低两层,并且最后一层的叶子节点从左到右依次排列。

对于一个深度为k的完全二叉树而言,它的节点数量一定在2^(k-1)和2^k之间。

2. 二叉树的遍历二叉树的遍历是指按照一定的顺序访问二叉树的所有节点。

二叉树的遍历主要包括前序遍历、中序遍历和后序遍历三种。

2.1 前序遍历(Pre-order traversal)前序遍历的顺序是:根节点 -> 左子树 -> 右子树。

对于一个二叉树而言,前序遍历的结果就是按照“根-左-右”的顺序访问所有节点。

2.2 中序遍历(In-order traversal)中序遍历的顺序是:左子树 -> 根节点 -> 右子树。

对于一个二叉树而言,中序遍历的结果就是按照“左-根-右”的顺序访问所有节点。

2.3 后序遍历(Post-order traversal)后序遍历的顺序是:左子树 -> 右子树 -> 根节点。

2017唐班数据结构-20二叉查找树

2017唐班数据结构-20二叉查找树
return t;▌
FindMin和FindMax
算法FindMin(t) /* 在以t为根的树找最小元素*/ F1[一路向左]
if( t != NULL ) while( t->llink != NULL) t = t->llink;
return t;
插入
O
E
U
A
I
5
6
1
23
4
O
E
U
A
I
6
7
情况2:“双重转动”。 首先,以 X 为轴将 B 从 X 的右上侧右转到 X 的 右下侧,记为(X,B),从而 A 的右儿子是 X,
X 的右儿子是 B,原 X 的右子树 变成了新 B
的左子树;
A B
A X
h
+X
h
h
•B
h1
h
h1
h
h
然后,以 X 为轴心 , 把 A 从 X 的左上方左转到 X 的左下侧 , 记为(A , X) , 使 X 的左儿子是 A , 右儿子
KEY DATA B
LLINK
RLINK
ROOT
树形总高度
B RLINK
DATA KEY B
LLINK
RLINK
查找和插入操作
在一株高度平衡二叉树上插入结点,可能会破坏其平衡性。 如,在图 8.23 中,如果新结点被插入高度平衡树的外结点
4 , 5 , 6 , 7 , 10 , 13 等处则无损平衡性。
第八章 查找 II 树查找
树的引入
对半查找、斐波那契查找等都对应一棵隐 式的(implicit)二叉树;
用一个显式的(explicit)二叉树结构组织数据 进行查找;

二叉树实验报告

二叉树实验报告

二叉树实验报告二叉树实验报告引言:二叉树作为一种常用的数据结构,在计算机科学领域中具有广泛的应用。

本实验旨在通过实际操作和观察,深入理解二叉树的特性和运用。

一、二叉树的基本概念1.1 二叉树的定义二叉树是一种特殊的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

树的最顶层节点称为根节点。

1.2 二叉树的特点二叉树具有以下特点:- 每个节点最多有两个子节点,分别称为左子节点和右子节点;- 左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值;- 二叉树的左子树和右子树也是二叉树。

二、二叉树的遍历方式2.1 先序遍历先序遍历是指先访问根节点,然后按照先序遍历的方式依次访问左子树和右子树。

2.2 中序遍历中序遍历是指按照中序遍历的方式依次访问左子树,根节点和右子树。

2.3 后序遍历后序遍历是指按照后序遍历的方式依次访问左子树,右子树和根节点。

三、二叉树的实验操作3.1 二叉树的创建为了便于实验操作,我们选择使用Python编程语言来实现二叉树的创建和操作。

首先,我们需要定义一个二叉树节点的类,包含节点的值、左子节点和右子节点。

3.2 二叉树的插入在已有的二叉树中插入一个新的节点,需要遵循二叉树的规则。

如果插入的节点值小于当前节点的值,则将节点插入到当前节点的左子树;如果插入的节点值大于当前节点的值,则将节点插入到当前节点的右子树。

3.3 二叉树的查找在二叉树中查找一个特定的节点,需要遍历整个二叉树。

从根节点开始,如果要查找的节点值小于当前节点的值,则继续在左子树中查找;如果要查找的节点值大于当前节点的值,则继续在右子树中查找;如果要查找的节点值等于当前节点的值,则找到了目标节点。

3.4 二叉树的删除在二叉树中删除一个节点,需要考虑多种情况。

如果要删除的节点没有子节点,直接将其删除即可;如果要删除的节点只有一个子节点,将子节点替换为要删除的节点;如果要删除的节点有两个子节点,需要找到其右子树中的最小节点,将其值替换到要删除的节点,然后删除最小节点。

数据结构:第9章 查找2-二叉树和平衡二叉树

NODE *t; char x; {if(t==NULL)
return(NULL); else
{if(t->data==x) return(t);
if(x<(t->data) return(search(t->lchild,x));
else return(search(t->lchild,x)); } }
——这种既查找又插入的过程称为动态查找。 二叉排序树既有类似于折半查找的特性,又采用了链表存储, 它是动态查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
讨论1:二叉排序树的插入和查找操作 例:输入待查找的关键字序列=(45,24,53,45,12,24,90)
二叉排序树的建立 对于已给定一待排序的数据序列,通常采用逐步插入结点的方 法来构造二叉排序树,即只要反复调用二叉排序树的插入算法 即可,算法描述为: BiTree *Creat (int n) //建立含有n个结点的二叉排序树 { BiTree *BST= NULL;
for ( int i=1; i<=n; i++) { scanf(“%d”,&x); //输入关键字序列
– 法2:令*s代替*p
将S的左子树成为S的双亲Q的右子树,用S取代p 。 若C无右子树,用C取代p。
例:请从下面的二叉排序树中删除结点P。
F P
法1:
F
P
C
PR
C
PR
CL Q
CL QL
Q SL
S PR
QL S
SL
法2:
F
PS
C
PR
CL Q
QL SL S SL

数据结构 -第12周查找第3讲-二叉排序树.pdf

以二叉树或树作为表的组织形式,称为树表,它是一类动态查找表,不仅适合于数据查找,也适合于表插入和删除操作。

常见的树表:二叉排序树平衡二叉树B-树B+树9.3.1 二叉排序树二叉排序树(简称BST)又称二叉查找(搜索)树,其定义为:二叉排序树或者是空树,或者是满足如下性质(BST性质)的二叉树:❶若它的左子树非空,则左子树上所有节点值(指关键字值)均小于根节点值;❷若它的右子树非空,则右子树上所有节点值均大于根节点值;❸左、右子树本身又各是一棵二叉排序树。

注意:二叉排序树中没有相同关键字的节点。

二叉树结构满足BST性质:节点值约束二叉排序树503080209010854035252388例如:是二叉排序树。

66不试一试二叉排序树的中序遍历序列有什么特点?二叉排序树的节点类型如下:typedef struct node{KeyType key;//关键字项InfoType data;//其他数据域struct node*lchild,*rchild;//左右孩子指针}BSTNode;二叉排序树可看做是一个有序表,所以在二叉排序树上进行查找,和二分查找类似,也是一个逐步缩小查找范围的过程。

1、二叉排序树上的查找Nk< bt->keybtk> bt->key 每一层只和一个节点进行关键字比较!∧∧p查找到p所指节点若k<p->data,并且p->lchild=NULL,查找失败。

若k>p->data,并且p->rchild=NULL,查找失败。

查找失败的情况加上外部节点一个外部节点对应某内部节点的一个NULL指针递归查找算法SearchBST()如下(在二叉排序树bt上查找关键字为k的记录,成功时返回该节点指针,否则返回NULL):BSTNode*SearchBST(BSTNode*bt,KeyType k){if(bt==NULL||bt->key==k)//递归出口return bt;if(k<bt->key)return SearchBST(bt->lchild,k);//在左子树中递归查找elsereturn SearchBST(bt->rchild,k);//在右子树中递归查找}在二叉排序树中插入一个关键字为k的新节点,要保证插入后仍满足BST性质。

数据结构:二叉搜索树的基本操作

数据结构:二叉搜索树的基本操作前言碎语这因为学习树结构里面的最基本操作了,但是作为小白入门,哪怕是最基础的也会感觉困难重重,所以,最稳的方法:乐观好心态,咱一步一步,一点一点来。

几点说明树的结构在定义的时候,用的是嵌套结构,即树的左右子树也都是树。

在建立树的时候,每一次只申请一块栈空间,所以需要for循环来调用;BST、BST -> Left、BST -> Right表示的都是地址,所以Insert函数那里,最后返回的是地址。

原题描述二叉搜索树的操作集 (30 point(s))本题要求实现给定二叉搜索树的5种常用操作。

函数接口定义:BinTree Insert( BinTree BST, ElementType X );BinTree Delete( BinTree BST, ElementType X );Position Find( BinTree BST, ElementType X );Position FindMin( BinTree BST );Position FindMax( BinTree BST );其中BinTree结构定义如下:typedef struct TNode *Position;typedef Position BinTree;struct TNode{ElementType Data;BinTree Left;BinTree Right;};函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针;函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针;函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;函数FindMin返回二叉搜索树BST中最小元结点的指针;函数FindMax返回二叉搜索树BST中最大元结点的指针。

裁判测试程序样例:#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct TNode *Position;typedef Position BinTree;struct TNode{ElementType Data;BinTree Left;BinTree Right;};void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */void InorderTraversal( BinTree BT ); /* 中序遍历,由裁判实现,细节不表 */BinTree Insert( BinTree BST, ElementType X );BinTree Delete( BinTree BST, ElementType X );Position Find( BinTree BST, ElementType X );Position FindMin( BinTree BST );Position FindMax( BinTree BST );int main(){BinTree BST, MinP, MaxP, Tmp;ElementType X;int N, i;BST = NULL;scanf("%d", &N);for ( i=0; i<N; i ) {scanf("%d", &X);BST = Insert(BST, X);}printf("Preorder:"); PreorderTraversal(BST); printf("\n");MinP = FindMin(BST);MaxP = FindMax(BST);scanf("%d", &N);for( i=0; i<N; i ) {scanf("%d", &X);Tmp = Find(BST, X);if (Tmp == NULL) printf("%d is not found\n", X);else {printf("%d is found\n", Tmp->Data);if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);}}scanf("%d", &N);for( i=0; i<N; i ) {scanf("%d", &X);BST = Delete(BST, X);}printf("Inorder:"); InorderTraversal(BST); printf("\n");return 0;}/* 你的代码将被嵌在这里 */输入样例:105 86 2 4 1 0 10 9 756 3 10 0 555 7 0 10 3输出样例:Preorder: 5 2 1 0 4 8 6 7 10 96 is found3 is not found10 is found10 is the largest key0 is found0 is the smallest key5 is foundNot FoundInorder: 1 2 4 6 8 9具体实现如下#include <cstdio>#include <cstdlib>//BinTree 结构定义typedef int ElementType;typedef struct TNode *Position;typedef Position BinTree;struct TNode {ElementType Data;BinTree Left;BinTree Right;};//实现前序、中序、后序遍历//这里的遍历就是把printvoid PreorderTraversal(BinTree BT);void InorderTraversal(BinTree BT);void PostorderTraversal(BinTree BT);//层序遍历//需要用到队列结构//void LevelorderTraversal(BinTree BT);//实现插入、删除、查找结点,最大最小结点的位置BinTree Insert(BinTree BST, ElementType X); BinTree Delete(BinTree BST, ElementType X); Position Find(BinTree BST, ElementType X); Position FindMin(BinTree BST);Position FindMax(BinTree BST);int main()BinTree BST, MinP, MaxP, Tmp;ElementType X;int N, i;BST = NULL;scanf("%d", &N);for ( i=0; i<N; i ) {scanf("%d", &X);BST = Insert(BST, X);}printf("Preorder:"); PreorderTraversal(BST); printf("\n");MinP = FindMin(BST);MaxP = FindMax(BST);scanf("%d", &N);for( i=0; i<N; i ) {scanf("%d", &X);Tmp = Find(BST, X);if (Tmp == NULL) printf("%d is not found\n", X);else {printf("%d is found\n", Tmp->Data);if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);}}scanf("%d", &N);for( i=0; i<N; i ) {scanf("%d", &X);BST = Delete(BST, X);printf("Inorder:"); InorderTraversal(BST); printf("\n");return 0;}//中序遍历void InorderTraversal(BinTree BT){if (BT) {InorderTraversal(BT -> Left);printf("%d ", BT -> Data);InorderTraversal(BT -> Right);}}//前序遍历void PreorderTraversal(BinTree BT){if (BT) {printf("%d ", BT -> Data);PreorderTraversal(BT -> Left); PreorderTraversal(BT -> Right);}}//后序遍历void PostorderTraversal(BinTree BT){if (BT) {PostorderTraversal(BT -> Left); PostorderTraversal(BT -> Right);printf("%d ", BT -> Data);}}//二叉搜索树的插入BinTree Insert(BinTree BST, ElementType X){//如果是空树,申请一个结点空间if (!BST) {BST = (BinTree)malloc(sizeof(struct TNode));//然后把数据存进去(即根结点,和链表的头结点有些不同)BST -> Data = X;BST -> Left = BST -> Right = NULL;}else {if (X < BST -> Data)//因为返回的是结点的地址BST -> Left = Insert(BST -> Left, X);else if (X > BST -> Data)BST -> Right = Insert(BST -> Right, X);}return BST; //正好相等时直接返回}BinTree Delete(BinTree BST, ElementType X){Position Temp; //临时结点if (!BST)printf("Not Found\n");else {if (X < BST -> Data)BST -> Left = Delete(BST -> Left, X);else if (X > BST -> Data)BST -> Right = Delete(BST -> Right, X);else {//这里需要分该结点有左右孩子//就找左子树最大或者右子树最小if (BST -> Left && BST -> Right) {Temp = FindMax(BST -> Left);BST -> Data = Temp -> Data;//重新赋值,“相当于”结点的删除//然后把这个结点删掉就好BST -> Left = Delete(BST -> Left, BST -> Data); }else {Temp = BST;if (!BST -> Left)BST = BST -> Right;elseBST = BST -> Left;free(Temp);}}}return BST;}//直接查找,while循环Position Find(BinTree BST, ElementType X) {while (BST) {if (X < BST -> Data)BST = Find(BST -> Left, X);else if (X > BST -> Data)BST = Find(BST -> Right, X);elsereturn BST;}return NULL;}//最小一定在最左的孩子上Position FindMin(BinTree BST){if (!BST)return NULL;else if (!BST -> Left)return BST;elsereturn FindMin(BST -> Left);}Position FindMax(BinTree BST){if (!BST)return NULL;else if (!BST -> Right)return BST;elsereturn FindMax(BST -> Right); }来源:。

树的遍历题目

树的遍历题目以下是关于树的遍历的一些题目:
1. 二叉树的深度
2. 二叉树的遍历
3. 判断一棵二叉树是否为完全二叉树
4. 二叉树的层序遍历(广度优先遍历)
5. 二叉树的链式存储结构(单链表表示法)
6. 二叉树的顺序存储结构(数组表示法)
7. 二叉树的先序遍历(前序遍历)
8. 二叉树的中序遍历(中序遍历)
9. 二叉树的后序遍历(后序遍历)
10. 构建一棵二叉搜索树
11. 二叉搜索树的查找
12. 二叉搜索树的插入
13. 二叉搜索树的删除
14. 平衡二叉树(AVL树)的插入
15. 平衡二叉树(AVL树)的查找
16. 平衡二叉树(AVL树)的删除
17. 红黑树的插入
18. 红黑树的查找
19. 红黑树的删除
20. B树和B+树的查找、插入和删除操作
21. 判断一棵树是否为二叉树
22. 判断一棵树是否为满二叉树
23. 判断一棵树是否为完全二叉树
24. 判断一棵树是否为平衡二叉树
25. 判断一棵树是否为红黑树
26. 求一棵树的直径
27. 求一棵树的周长。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二叉树的链式实现
Binary_tree (const Binary tree<Entry> &original); Binary_tree & operator = (const Binary_tree<Entry> &original); Binary_tree( ); protected: // Add auxiliary function prototypes here. Binary_node<Entry> *root; };
第10章 二叉树
主要内容

二叉树 二叉查找树ຫໍສະໝຸດ 建立二叉查找树高度平衡:AVL树
二叉树

定义:

一棵二叉树或者是空的,或者事由一个称为根的结点和根的称为左 子树和右子树的两棵二叉树组成. 基本情况:

两个结点:

三个结点:
二叉树

二叉树的遍历
对于给定的一个结点,我们希望以某种次序完成3个任务:
二叉树的链式实现
通常,我们将发现由递归过程自然描述的任何Binary_tree
的方法能方便的通过调用一个应用于子树的辅助递归函数 来实现.辅助的中序遍历函数用下面的简单递归实现.
template <class Entry> void Binary_tree<Entry> ::recursive_inorder(Binary_node<Entry> *sub_root,void (*visit)(Entry &)) /* Pre: sub_root is either NULL or points to a subtree of the Binary_tree . Post: The subtree has been traversed in inorder sequence. Uses: The function recursive_inorder recursively */
Empty:
template <class Entry> bool Binary_tree<Entry> :: empty( ) const /* Post: A result of true is returned if the binary tree is empty. Otherwise, false is returned. */ { return root == NULL; }
二叉树的链式实现
{
if (sub_root != NULL) { recursive_inorder(sub_ root->left, visit); (*visit)(sub_root->data); recursive_inorder(sub_root->right, visit); }
}
Inorder Traversal of Binary Tree
二叉树的链式实现
Binary_node 类:
template <class Entry> struct Binary_node { // data members: Entry data; Binary_node<Entry> *left; Binary_node<Entry> *right; // constructors: Binary_node( ); Binary_node(const Entry &x); };
Preorder Traversal of Binary Tree Postorder Traversal of Binary Tree
二叉树的链式实现
template <class Entry> class Binary_tree { public: Binary_tree( ); bool empty( ) const; void preorder(void (*visit)(Entry &)); void inorder(void (*visit)(Entry &)); void postorder(void (*visit)(Entry &)); int size( ) const; void clear( ); int height( ) const; void insert(const Entry &);
二叉树的链式实现
中序遍历:
template <class Entry> void Binary_tree<Entry> :: inorder(void (*visit)(Entry &)) /* Post: The tree has been been traversed in inorder sequence. Uses: The function recursive_inorder */ { recursive_inorder(root, visit); }
二叉查找树

定义:
二叉查找树是一棵二叉树,它或者为空,或者它的每一个
结点有一个键(在数据元素内),而且满足下列条件:
根(如果存在)的键比左子树中任意结点的键大. 根(如果存在)的键比右子树中任意结点的键小. 根的左右子树还是二叉查找树.
二叉树的链式实现
构造函数:
template <class Entry> Binary_tree<Entry> :: Binary_tree( ) /* Post: An empty binary tree has been created. */ { root = NULL; }
二叉树的链式实现
访问结点本身(V),遍历左子树(L)和遍历右子树(R). VLR LVR LRV
前序
中序
后序
对于前序遍历,在访问子树之前访问结点. 对于中序遍历,在访问左右子树之间访问结点. 对于后序遍历,在访问两棵子树之后再访问根.
二叉树

表达式树
二叉树

表达式树
二叉树的链式实现
Binary_tree 类 template <class Entry> class Binary_tree { public: // Add methods here. protected: // Add auxiliary function prototypes here. Binary_node<Entry> *root; };
相关文档
最新文档