《算法六》(有序二叉树)

有序二叉树:
  二叉树:每个节点有且只有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;
}

有点问题:

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

原文地址:https://www.cnblogs.com/Whgy/p/12290994.html