二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
二叉搜索树也是一种特殊的二叉树,因此其遍历方式仍然分为前序遍历、中序遍历和后序遍历三种,其代码实现基本上分为递归和循环两种,这里要注意递归和循环的相互转换也是应该熟练掌握的技能,因为递归层次太深可能造成栈溢出。比较难的是后序遍历的循环方法,需重点掌握!
/*
binary tree search
*/
#include "iostream"
#include "stack"
using namespace std;
struct Node
{
int m_value;
Node* p_left;
Node* p_right;
};
void preOrderBinaryTree(Node *root);
void preOrderBinaryTree_loop(Node *root);
void inOrderBinaryTree(Node *root);
void inOrderBinaryTree_loop(Node *root);
void postOrderBinaryTree(Node *root);
void postOrderBinaryTree_loop(Node *root);
void insertBinaryTree(int value, Node **root);
bool binaryTree_Search(const int target,const Node *root);
int main()
{
int element(0);
int counter(0);
int i(0);
cout<<"Please input the num of nodes: "<
>counter;
cout<<"Please input the nodes value list: "<
>element;
insertBinaryTree(element,&root);
++i;
}
//preOrderBinaryTree(root);
//preOrderBinaryTree_loop(root);
//inOrderBinaryTree(root);
//inOrderBinaryTree_loop(root);
//postOrderBinaryTree(root);
//postOrderBinaryTree_loop(root);
cout<<"Please input the target you wanna find:"<
>element;
bool result=binaryTree_Search(element,root);
if(result)
cout<<"find it!!"<
m_value<
p_left) preOrderBinaryTree(root->p_left); if(NULL!=root->p_right) preOrderBinaryTree(root->p_right); } //preorder traversal ,with loop void preOrderBinaryTree_loop(Node *root) { stack
temp;//type of element in stack! recursive equal to stack if(NULL!=root) //uppercase "NULL" temp.push(root);// else return; while(!temp.empty()) { Node *temp_node=temp.top(); cout<
m_value<
p_right) temp.push(temp_node->p_right); if(NULL!=temp_node->p_left) temp.push(temp_node->p_left); } } //in order traversal,with recursive void inOrderBinaryTree(Node *root) { if(NULL==root) return; if(NULL!=root->p_left) inOrderBinaryTree(root->p_left); cout<
m_value<
p_right) inOrderBinaryTree(root->p_right); } //in order traversal,with loop, important!!!!! void inOrderBinaryTree_loop(Node *root) { if(NULL==root) return; stack
temp; Node *p=root; while(!temp.empty()||NULL!=p) { if(NULL!=p)//recursive to the left leave { temp.push(p); p=p->p_left; } else { p=temp.top(); temp.pop(); cout<
m_value<
p_right; } } } //post order traversal,with recursive void postOrderBinaryTree(Node *root) { if(NULL==root) return; if(NULL!=root->p_left) postOrderBinaryTree(root->p_left); if(NULL!=root->p_right) postOrderBinaryTree(root->p_right); cout<
m_value<
temp; Node *p=root; do { while(NULL!=p) { temp.push(p); p=p->p_left; } Node *q=NULL;//save the last printed node while(!temp.empty()) { p=temp.top(); temp.pop(); if(p->p_right==q)//right child not exist or has been visited { cout<
m_value<
p_right;//handle right sub-tree break; } } }while(!temp.empty());//do not forget the comma } // insert a new value into the tree void insertBinaryTree(int value, Node **root) { Node *toInsert=new Node(); toInsert->p_left=NULL; toInsert->p_right=NULL; toInsert->m_value=value; Node *tempRoot=*root; if(NULL==*root) {*root=toInsert;return;} while(tempRoot->m_value!=value) { if(tempRoot->m_value
p_right==NULL) {tempRoot->p_right=toInsert;return;}//return not break else tempRoot=tempRoot->p_right; } else { if(tempRoot->p_left==NULL) {tempRoot->p_left=toInsert;return;} else tempRoot=tempRoot->p_left; } } tempRoot->p_left=toInsert;//we'll put equal value to the left child } bool binaryTree_Search(const int target,const Node *root) { if(root==NULL) return false; if(root->m_value==target) return true; else if(root->m_value>target) { if(root->p_left!=NULL) return binaryTree_Search(target,root->p_left); else return false; } else { if(root->p_right!=NULL) return binaryTree_Search(target,root->p_right); else return false; } }