二叉查找树的插入与遍历
2014-04-24 23:04
176 查看
二叉排序树(BinarySortTree)又称二叉查找树(BinarySearchTree),亦称二叉搜索树。它或者是一棵空树;或者是具有下列性质的
(1)若左子树不空,则左子树上所有结点的值均小于它的
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
插入操作:
首先执行查找算法,找出被插结点的父亲结点。
判断被插结点是其父亲结点的左、右儿子。将被插结点作为
若
注意:新插入的结点总是
#include<stdio.h>
#include<stdlib.h>
typedefstructTreeNode*Tree;
structTreeNode
{
intnum;
Treeleft;
Treeright;
}TreeNode;
//二叉搜索树的递归插入
Treeinsert(Treeroot,intelement)
{
if(root==NULL)
{
root=(Tree)malloc(sizeof(TreeNode));
root->num=element;
root->left=NULL;
root->right=NULL;
}
elseif(root->num>=element)
{
root->left=insert(root->left,element);
}
else
{
root->right=insert(root->right,element);
}
returnroot;
}
//二叉搜索树的迭代插入
Treeinsert2(Treeroot,intelement)
{
Treenode=(Tree)malloc(sizeof(TreeNode));
Treebefore=NULL,tmp=root;
intflag=0;
node->num=element;
node->left=NULL;
node->right=NULL;
if(root==NULL)
{
printf("ddddd\n");
returnnode;
}
while(tmp)
{
before=tmp;
if(tmp->num>=element)
{
flag=0;//left
tmp=tmp->left;
}
else
{
flag=1;
tmp=tmp->right;
}
}
if(flag)
before->right=node;
else
before->left=node;
returnroot;
}
//递归前序遍历
voidpreOrder(Treeroot)
{
if(root)
{
printf("%d",root->num);
preOrder(root->left);
preOrder(root->right);
}
}
//迭代前序遍历下面是C++代码
/*
思想:从根节点开始,先打印节点信息(获取数据),如果节点有右孩子,则有孩子入栈;
如果有左孩子,当前指针指向左孩子,没有左孩子的话,出栈。继续这个过程,直到获取栈元素的时候栈为空。
voidPreOrder(BinaryTreeNode*pRoot)
{
if(pRoot==NULL)
return;
std::stack<BinaryTreeNode*>S;
BinaryTreeNode*p=pRoot;//二叉树分左右,所以光有栈不行,合理的运用遍历指针是关键之一
while(p!=NULL)
{
visit(p);//打印数据
if(p->m_pRight!=NULL)//右孩子进栈
S.push(p->m_pRight);
if(p->m_pLeft!=NULL)//
p=p->m_pLeft;
else
{
if(S.empty())
break;
p=S.top();
S.pop();
}
}
}*/
//递归中序遍历
voidinOrder(Treeroot)
{
if(root)
{
inOrder(root->left);
printf("%d",root->num);
inOrder(root->right);
}
}
/*
voidInOrder(BinaryTreeNode*pRoot)
{
if(pRoot==NULL)
return;
std::stack<BinaryTreeNode*>S;
BinaryTreeNode*p=pRoot;
do
{
while(p!=NULL)
{
S.push(p);
p->m_pLeft;
}
//若进行到这里左子树为空
if(!S.empty())//Stack不空时退栈,然后访问该元素
{
p=S.top();
S.pop();
visit(p);
p=p->m_pRight;
}
}while(p!=NULL||!S.empty());
//这里的p==NULL表示右子树为空,然后堆栈如果也空的话,才是处理完毕
}
*/
//递归后序遍历
voidpostOrder(Treeroot)
{
if(root)
{
postOrder(root->left);
postOrder(root->right);
printf("%d",root->num);
}
}
/*迭代后序遍历
voidPostOrder(BinaryTreeNode*pRoot)
{
if(pRoot==NULL)
return;
std::pair<BinaryTreeNode*,char>w;
std::stack<std::pair<BinaryTreeNode*,char>>S;
BinaryTreeNode*p=pRoot;
do
{
while(p!=NULL)//左子树经过节点加L进栈
{
w.first=p;
w.second='L';
S.push(w);
p=p->m_pLeft;
}
boolcontinuel=true;//继续循环标志,用于L改为R的时候就开始向右遍历
while(continuel&&!S.empty())//用一个break语句也能实现循环标志continuel的功能
{
w=S.top();
S.pop();
p=w.first;
if(w.second=='L')//标记为L表示左子树遍历完
{
w.second=='R';
S.push(w);
continuel=false;
p=p->m_pRight;
}
else
visit(p);//如果标记为R,表示右子树遍历完
}
}while(!S.empty());
}
*/
intmain(intargc,char**argv)
{
intarray[]={5,6,8,9,1,3,4,2,7,0};
inti;
Treetree=NULL;
for(i=0;i<10;i++)
{
tree=insert2(tree,array[i]);
}
printf("preOrder:\n");
preOrder(tree);
printf("\ninOrder\n");
inOrder(tree);
printf("\npostOrder\n");
postOrder(tree);
return0;
}
相关文章推荐
- 二叉查找树(查询、插入、遍历、删除)--Java实现
- java实现二叉查找树(插入、删除、遍历、查找)
- 二叉查找树原理分析及查找、插入、删除、遍历实现
- 二叉查找树的基本操作(建立,插入,删除,遍历)
- 转载:二叉查找树原理分析及查找、插入、删除、遍历实现
- 二叉查找树的插入、删除、遍历和查找等C++实现
- 二叉查找树(插入、查找、遍历、删除.........)
- 数据结构(C#)--二叉查找树的先序,中序,后序的遍历问题以及最大值,最小值,插入,删除
- 二叉树2(二叉查找树的插入、查找、删除、遍历)
- 算法导论中十二章C++实现二叉查找树建立,插入,删除,遍历操作
- Java实现二叉查找树的创建、查找、插入、删除、遍历
- 二叉查找树的各种操作(插入、删除、查找、遍历)
- 简易版二叉查找树(查找,插入,遍历,删除)
- C语言实现二叉查找树(搜索树)的创建,插入,查找,删除
- 链表定义以及实现(遍历,节点计数,插入节点)--1(面向对象的方法实现)
- 用结构体实现链表的创建、遍历、结点插入、结点删除、链表删除-----带菜单选项
- 二叉查找树--查找、删除、插入(Java实现)
- 二叉查找树的前序遍历,后序遍历和中序遍历互求算法模板
- 【单链表经典面试题解析三】在无头单链表的一个非头节点前插入一个节点(要求不能遍历单链表)
- 二叉查找树--插入、删除、查找