二叉树相关操作之一
来源:互联网 发布:openwrt 安装软件 编辑:程序博客网 时间:2024/04/26 18:23
//erchashu.h
#include<iostream>#include<stdio.h>#include<queue>using namespace std;template <class T> struct BinTreeNode { //二叉树结点类定义 T data; //数据域 BinTreeNode<T> *leftChild, *rightChild; //左子女、右子女链域 BinTreeNode () //构造函数 { leftChild = NULL; rightChild = NULL; } BinTreeNode (T x) { BinTreeNode<T> *l = NULL; BinTreeNode<T> *r = NULL; data = x; leftChild = l; rightChild = r; }};template <class T>class BinaryTree{public:void CreateBinTree1(){CreateBinTree(root);}void PreOrder1(){PreOrder(root);}void InOrder1(){InOrder(root);}void PostOrder1(){PostOrder(root);}void levelOrder1(){levelOrder(root);}int Hight1(){return Hight(root);}int Size1(){return Size(root);}int leafSize1(){return leafSize(root);}int doubleSize1(){return doubleSize(root);}int singleSize1(){return singleSize(root);}private:void CreateBinTree(BinTreeNode<T> *& subTree); //建立二叉树void PreOrder(BinTreeNode<T> *& subTree);//前序、void InOrder(BinTreeNode<T> *& subTree);//中序、void PostOrder(BinTreeNode<T> *& subTree);//后序void levelOrder(BinTreeNode<T> *& root);//层次顺序遍历二叉树的算法int Hight(BinTreeNode<T> * subTree); //二叉树深度、int Size(BinTreeNode<T> * subTree);//所有结点总数、int leafSize(BinTreeNode<T> * subTree);//叶子结点数、int doubleSize(BinTreeNode<T> * subTree);//双孩子结点个数、int singleSize(BinTreeNode<T> * subTree);//单孩子结点个数的算法BinTreeNode<T> *root;char ch;};template <class T>void BinaryTree<T>::CreateBinTree(BinTreeNode<T> *& subTree) //建立二叉树{scanf("%c", &ch);if (ch == 'a'){subTree = NULL;}else {subTree = new BinTreeNode<T>;if (subTree == NULL) {cerr << "存储分配错!" << endl;exit (1);}subTree->data = ch;CreateBinTree(subTree->leftChild);CreateBinTree(subTree->rightChild);}}template <class T>void BinaryTree<T>::PreOrder(BinTreeNode<T> *& subTree)//前序、{if (subTree != NULL){cout << subTree->data;PreOrder(subTree->leftChild);PreOrder(subTree->rightChild);}}template <class T>void BinaryTree<T>::InOrder(BinTreeNode<T> *& subTree)//中序、{if (subTree != NULL){InOrder(subTree->leftChild);cout << subTree->data;InOrder(subTree->rightChild);}}template <class T>void BinaryTree<T>::PostOrder(BinTreeNode<T> *& subTree)//后序{if (subTree != NULL){PostOrder(subTree->leftChild);PostOrder(subTree->rightChild);cout << subTree->data;}}template <class T>void BinaryTree<T>::levelOrder(BinTreeNode<T> *& root)//层次顺序遍历二叉树的算法{if (root == NULL) return;queue<BinTreeNode<T> * > Q; Q.push(root); while (!Q.empty()) {cout << Q.front()->data;if (Q.front()->leftChild != NULL){ Q.push(Q.front()->leftChild);}if (Q.front()->rightChild != NULL){Q.push(Q.front()->rightChild);}Q.pop();} }template <class T>int BinaryTree<T>::Hight(BinTreeNode<T> * subTree) //二叉树深度、{if (subTree == NULL)return 0;else {int i = Hight(subTree->leftChild);int j = Hight(subTree->rightChild);return i > j ? i + 1 : j + 1;}}template <class T>int BinaryTree<T>::Size(BinTreeNode<T> * subTree)//所有结点总数、{if (subTree == NULL)return 0;elsereturn 1 + Size(subTree->leftChild) + Size(subTree->rightChild);}template <class T>int BinaryTree<T>::leafSize(BinTreeNode<T> * subTree)//叶子结点数、{if (subTree == NULL){return 0;}if (subTree->leftChild == NULL && subTree->rightChild == NULL){return 1;} else {return leafSize(subTree->leftChild) + leafSize(subTree->rightChild);}}template <class T>int BinaryTree<T>::doubleSize(BinTreeNode<T> * subTree)//双孩子结点个数、{if (subTree == NULL)return 0;else {if (subTree->leftChild != NULL && subTree->rightChild != NULL)return 1;elsereturn doubleSize(subTree->leftChild) + doubleSize(subTree->rightChild);}}template <class T>int BinaryTree<T>::singleSize(BinTreeNode<T> * subTree)//单孩子结点个数的算法{if (subTree == NULL)return 0;else {if (subTree->leftChild == NULL || subTree->rightChild == NULL)return 1;elsereturn singleSize(subTree->leftChild) + singleSize(subTree->rightChild);}}
//main.h
#include"erchashu.h"int main(){BinaryTree<char> s;s.CreateBinTree1();cout << "前序" << endl;s.PreOrder1();cout << endl;cout << "中序" << endl;s.InOrder1();cout << endl;cout << "后序" << endl;s.PostOrder1();cout << endl;cout << "层次顺序遍历" << endl;s.levelOrder1();cout << endl;cout << "二叉树深度、" << endl;cout << s.Hight1() << endl;cout << "所有结点总数" << endl;cout << s.Size1() << endl;cout << "叶子结点数" << endl;cout << s.leafSize1() << endl;cout << "双孩子结点个数" << endl;cout << s.doubleSize1() << endl;cout << "单孩子结点个数" << endl;cout << s.singleSize1() << endl;return 0;}
- 二叉树相关操作之一
- 二叉树相关操作
- 二叉树相关操作
- 二叉树相关操作
- 二叉树相关操作
- 二叉树 相关操作
- 二叉树相关操作
- 二叉树相关操作
- 二叉树相关操作
- 二叉树的相关操作
- 二叉树相关操作收集
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树相关操作2
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 二叉树的相关操作
- 做一名合格的女程序员
- ZooKeeper典型应用场景
- 验证码生成函数
- SQL数据库中的表出现相同记录该怎么删除?
- c语言多维指针笔记
- 二叉树相关操作之一
- “递归”之无限分类处理(一)
- mysql 存储过程1064问题和事例
- Box of Bricks
- hdu-1082Matrix Chain Multiplication
- ZooKeeper的快速搭建
- 第六节 ViewPager
- dbutils 重写BeanProcessor 部分方法,支持enum的转换
- 【20121203】HDU1002