zoukankan      html  css  js  c++  java
  • 《算法六》(有序二叉树)

    有序二叉树:
      二叉树:每个节点有且只有2个孩子
      有序二叉树:左孩子<根<右孩子(升序二叉树)

            左孩子>根>右孩子(降序二叉树)
      叶子节点:没有孩子的节点

    有序二叉树节点定义:(数据+左孩子+右孩子)

    template<class T>
    class Tree{
    	struct Node{
    		T data;//数据 
    		Node* left;//左孩子 
    		Node* right;//右孩子 
    	};
     	Node* pRoot;//根节点 
     	
    public:
    	//构造器 
    	Tree(){
    		pRoot = NULL;//默认根节点为NULL 
    	}
    	//析构器 
    	~Tree(){
    //		if(pRoot)
    //	 	    _clear();
    //		pRoot = NULL;
    	}
    	//添加节点 
    	void insert(const T& data);//插入数据data 
    	void printT();//遍历打印整棵树
    	
    
    	void _insert(Node** pRoot, const T& data);//往pRoot里插入数据data 
    //	_clear(){
    //		
    //	} 
    	Node* createNode(const T& data){//创造一个Node节点 
    		Node* pNew = new Node;
    		pNew->data = data;
    		pNew->left = pNew->right = NULL;
    		return pNew;
    	}
    	void _printTree(Node* pRoot);//遍历打印整棵树
    
        
    }; 

    完整代码实现:

    #include<iostream>
    #include<vector>
    #include<string.h>
    
    template<class T>
    class Tree{
    	struct Node{
    		T data;//数据 
    		Node* left;//左孩子 
    		Node* right;//右孩子 
    	};
     	Node* pRoot;//根节点 
     	
    public:
    	//构造器 
    	Tree(){
    		pRoot = NULL;//默认根节点为NULL 
    	}
    	//析构器 
    	~Tree(){
    //		if(pRoot)
    //	 	    _clear();
    //		pRoot = NULL;
    	}
    	//添加节点 
    	void insert(const T& data);//插入数据data 
    	void printT();//遍历打印整棵树
    	
    
    	void _insert(Node** pRoot, const T& data);//往pRoot里插入数据data 
    //	_clear(){
    //		
    //	} 
    	Node* createNode(const T& data){//创造一个Node节点 
    		Node* pNew = new Node;
    		pNew->data = data;
    		pNew->left = pNew->right = NULL;
    		return pNew;
    	}
    	void _printTree(Node* pRoot);//遍历打印整棵树
    
        
    }; 
    
    template<class T>
    //遍历打印整棵树 
    void Tree<T>::_printTree(Node* pRoot){
        //Node* pTemp = *pRoot; 
        if(pRoot != NULL){
        	printf("%d ", pRoot->data);
    	}
    	if(pRoot == NULL){
    		_printTree(pRoot->left);
    		_printTree(pRoot->right);
    	}
    	printf("
    "); 
    }
    
    
    template<class T>
    void Tree<T>::_insert(Node** pRoot, const T& data){
    	Node* pNew = createNode(data);
    	//新节点成为根节点 
    	if( (*pRoot) == NULL ){
    		*pRoot = pNew;
    		return; 
    	}
    	
    	//新节点成为左节点 
    	if((*pRoot)->data > data){
    		
    		_insert(&((*pRoot)->left), data);
    	}
    	//新节点成为右节点 
    	if((*pRoot)->data < data){
    		_insert(&((*pRoot)->right), data);
    	}
    	
    	/*
    	Node* pTemp = (*pRoot);
    	while(pTemp){
    		
    		
    		if(pTemp->left){
    			if()
    		}else if(pTemp->right){
    			
    		}else{
    			if(pTemp->data > data)
       			    pTemp->left = pNew;
    			if(pTemp->data < data)
       			    pTemp->right = pNew;
    		}
    		
    		if(pTemp->data == data)
       		    return;
    		
    	}
    	*/
    	
    	/*
    	if(this->pRoot){//this->pRoot不为NULL,说明要插入的不是根节点 
    		while(this->pRoot->left){
    			
    		}
    	}else{//this->pRoot为NULL,插入根节点 
    		this->pRoot = pNew; 
    	}
    	*/ 
    }
    
    
    template<class T>
    void Tree<T>::insert(const T& data){
    	_insert(&pRoot, data);//往pRoot里插入数据data 
    }
    
    template<class T>
    void Tree<T>::printT(){
    	_printTree(pRoot); 
    }
    
    
    int main(){
    	Tree<int> t;
    	t.insert(2);
     	t.insert(0);
     	t.insert(3);
     	t.insert(4);
     	t.printT();
    	return 0;
    }

    有点问题:

    创建应该没有问题,打印的时候只打印了根节点就结束了,没找到问题所在。

  • 相关阅读:
    Hadoop、spark
    Hadoop、spark
    Hadoop、spark
    Hadoop、spark
    SQL查询表中的用那些索引
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    【转】迷你区块链(mini blockchain in python)
    理解 Web 3
    【转】数字货币钱包:生态及技术
    【转】用 Witnet 协议使加密网络可以跨链访问
  • 原文地址:https://www.cnblogs.com/Whgy/p/12290994.html
Copyright © 2011-2022 走看看