二叉搜索树的基本操作(含代码)

二叉查找树(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; } } 
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值