数据结构之二叉树的建立与遍历(C++版)

    好久没用C++了,今天一个让我帮忙修改她写的C++写的二叉树建立 与遍历程序,看得我满头包啊!!!写一个二叉树为什么要用类,多麻烦啊~一个结构体不是轻松搞定~用C++的类还得写一个节点类,一个二叉树类。。。

    但作为一个优秀的编程人员怎么能不会用C++写数据结构!?于是我重拾信息,刻苦专研了一下,补习一下。


#include <iostream>
#include <queue>
using namespace std;

typedef char elemType;
#define LEAFFLAG '#'


//二叉树节点类
class BTnode {
	public:
	    int data;
	    struct BTnode *lchild, *rchild;
};

//二叉树类
class BTree {
	public:
		BTnode *root;
	    BTree()
	    {
	        root=NULL;
	    }
	    BTnode *createTree(elemType *arr, int &curP, int length);
	    void PreOrderCreateTree(elemType *arr, int length);
	    void InOrder(BTnode *node);
	    void LevelOrder();
};

//先序序列作为输入构建一棵二叉树
void BTree::PreOrderCreateTree(elemType *arr, int length) {
	int curPointer = -1;
	root = createTree(arr, curPointer, length);
}

BTnode *BTree::createTree(elemType *arr, int &curP, int length) {
	curP++;
	BTnode *treeNode;
	if(curP >= length) {
		return NULL;
	} else {
		if(arr[curP] == LEAFFLAG) {
			treeNode = NULL;
		} else {
			treeNode = new BTnode;
			treeNode->data = arr[curP];
			treeNode->lchild = createTree(arr, curP, length);
			treeNode->rchild = createTree(arr, curP, length); 
		}
		return treeNode;
	}
}

//中序遍历
void BTree::InOrder(BTnode *node)
{
    if( node != NULL) {
    	InOrder(node->lchild);
    	cout<<(elemType)node->data<<" | ";
    	InOrder(node->rchild);
	}
}

//层序遍历
void BTree::LevelOrder()
{
    if(root == NULL) {
    	return;
	}
	queue<BTnode*> que;
	que.push(root);
	while(!que.empty()) {
		BTnode *node;
		node = que.front();
		que.pop();
		cout<<(elemType)node->data<<" | ";
		if(node->lchild != NULL) {
			que.push(node->lchild);
		}
		if(node->rchild != NULL) {
			que.push(node->rchild);
		}
	}
	cout<<endl;
}

int main()
{
    BTree tree;
    int length;
    cout<<"please input the number of elements(PreOrder) of BinaryTree"<<endl;
    cin>>length;
    
    elemType arr[length];
    cout<<"please input elements(PreOrder) for BinaryTree, 结点为空输#"<<endl;
    for(int i = 0; i < length; i++) {
    	cin>>arr[i];
	}
    tree.PreOrderCreateTree(arr, length);
    cout<<"BinaryTree Created"<<endl;

    cout<<"InOrder"<<endl;
    tree.InOrder(tree.root);
    cout<<endl;

    cout<<"LevelOrder"<<endl;
    tree.LevelOrder();

    return 0;


} 

    这里需要说明一下:如此编写的程序在输入二叉树的时候,是要输入先序遍历的结果进去的,而且叶子结点的左右子节点不是NULL吗,是需要用#代替的,也就是说一颗只有abc三个结点的完全二叉树的输入长度为7,序列为a b # # c # #.

猜你喜欢

转载自blog.csdn.net/qq_26822029/article/details/80598149