github地址:https://github.com/lining91/BinTree
本文实现了二叉查找树的前序遍历(递归与非递归)、中序遍历(递归与非递归)、后序遍历(递归与非递归)、插入过程、删除过程、查找过程等。
二叉树的简单介绍:
1、二叉树中的每个节点都不能有多余两个的儿子。
2、二叉树的深度要比N小得多。
假设每个节点被指定一个关键字值(所有关键字是整数、互异的)。
二叉查找树的性质:
1、左子树的所有节点值均小于根节点值。
2、右子树的所有节点值均大于根节点值。
3、左右子树都满足上述两个条件。
插入过程:
1、若当前二叉树为空,则插入的元素为根节点。
2、若插入的元素值小于根节点值,则递归从根节点的左子树中找到可插入位置。
3、若插入的元素值大于根节点值,则递归从根节点的右子树中找到可插入位置。
删除过程:
1、待删除节点Z为叶子节点,则直接删除该节点。修改父节点的指针。
2、待删除节点Z为单支节点(只有左子树或者右子树),让Z的子树与Z的父节点相连,删除节点Z。
3、待删除节点Z左右子树都不为空。
方法一:找到Z的后继节点y,因为y一定没有左子树,所以可以直接删除y,并让y的父亲节点成为y的右子树的父亲节点。用y替换Z。
方法二:找到Z的前驱节点x,x一定没有右子树,所以可以直接删除x,并让x的父亲节点成为x的左子树的父亲节点。用x替换Z。
查找过程:
1、若待查找的元素值和根节点相同,则返回根节点。
2、若待查找的元素值小于根节点的元素值,则递归从根节点的左子树中查找。
3、若待查找的元素值大于根节点的元素值,则递归从根节点的右子树中查找。
遍历过程:
1、前序遍历(递归和非递归两种):先根节点,后左孩子节点,再右孩子结点。
2、中序遍历(递归和非递归两种):先左孩子结点,后根节点,再右孩子结点。
3、后序遍历(递归和非递归两种):先做孩子节点,后右孩子结点,再根节点。
获取最大元素的节点:
1、如果根节点无右子树,则返回根节点。
2、依次查询根节点的右子树节点,返回右子树的最后一个右节点。
获取最小元素的节点:
1、如果根节点无左子树,则返回根节点。
2、依次查询跟节点的左子树节点,返回左子树的最后一个左节点。
依次插入数据(15,3,20,8,10,18,6,1,26)之后的二叉树结构如下:
代码如下:
#include <iostream>
#include <stack>
using namespace std;
typedef struct STreeNode* pSTreeNode;
typedef int TreeKeyType;
struct STreeNode
{
TreeKeyType key;
pSTreeNode pLeftChild;
pSTreeNode pRightChild;
STreeNode( TreeKeyType Value )
{
key = Value;
pLeftChild = NULL;
pRightChild = NULL;
}
};
class CBinTree
{
public:
CBinTree();
~CBinTree();
void Insert( TreeKeyType Value );
void Insert( pSTreeNode pNode, TreeKeyType Value );
pSTreeNode Search( TreeKeyType Value );
pSTreeNode Search( pSTreeNode pNode, TreeKeyType Value );
void Delete( TreeKeyType Value );
void Preorder( ); // 前序遍历,非递归方法(借用堆栈)
void Inorder( ); // 中序遍历,非递归方法(借用堆栈)
void Postorder( ); // 后序遍历,非递归方法(借用堆栈)
void PreorderRecursively( pSTreeNode pNode ); // 前序遍历,递归调用
void InorderRecursively( pSTreeNode pNode ); // 中序遍历,递归调用