好久没用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 # #.