// wy.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <deque> using namespace std; int sum = 0; template <typename T> class TNode { public: TNode(){} TNode(T ele, TNode *p_left = NULL, TNode *p_right = NULL) { m_element = ele; m_left = p_left; m_right = p_right; } T m_element; TNode<T> *m_left; TNode<T> *m_right; }; template <typename T> class BinaryTree { public: BinaryTree() { root = NULL; } TNode<T>* BuildTree(); void CountLeafNumber1(TNode<T> *root); int CountLeafNumber2(TNode<T> *root); int CountLeafNumber3(); void SwapTree(TNode<T> *root); void MiddleOrder(TNode<T> *root); static int leafNumber; private: TNode<T> *root; }; template <typename T> int BinaryTree<T>::leafNumber = 0; //叶子节点的个数 template <typename T> bool TestEqual(TNode<T> *left, TNode<T> *right); void CreateTree(char middleOrder[], char postOrder[], TNode<char>* &root); int main() { BinaryTree<char> tree; TNode<char> *root = tree.BuildTree(); tree.CountLeafNumber1(root); cout<<"叶子节点数为:"<<tree.leafNumber<<endl; cout<<"叶子节点数为:"<<tree.CountLeafNumber2(root)<<endl; cout<<"叶子节点数为:"<<tree.CountLeafNumber3()<<endl; cout<<"转换前的中序为:"; tree.MiddleOrder(root); cout<<endl; tree.SwapTree(root); cout<<"转换后的中序为:"; tree.MiddleOrder(root); cout<<endl; BinaryTree<char> tree2; TNode<char> *root2 = tree2.BuildTree(); bool b = TestEqual(root, root2); if (b) cout<<"Equal!"<<endl; else cout<<"Not Equal!"<<endl; char *middle = "DGBEAFHC"; char *post = "GDEBHFCA"; TNode<char> *root3 = NULL; // CreateTree(middle, post, root3); } //函数功能:建二叉树 template <typename T> TNode<T>* BinaryTree<T>::BuildTree() { TNode<char> *g = new TNode<char>('G'); TNode<char> *e = new TNode<char>('E'); TNode<char> *h = new TNode<char>('H'); TNode<char> *d = new TNode<char>('D', NULL, g); TNode<char> *b = new TNode<char>('B', d, e); TNode<char> *f = new TNode<char>('F', NULL, h); TNode<char> *c = new TNode<char>('C', f, NULL); root = new TNode<char>('A', b, c); return root; } //函数功能:计算叶子节点数目(中序递归实现) template <typename T> void BinaryTree<T>::CountLeafNumber1(TNode<T> *root) { TNode<T> *temp = root; if (temp != NULL) { if ((temp->m_left == NULL) && (temp->m_right == NULL)) { leafNumber++; } CountLeafNumber1(temp->m_left); CountLeafNumber1(temp->m_right); } } //函数功能:计算二叉树叶子节点的个数(这种好理解) template <typename T> int BinaryTree<T>::CountLeafNumber2(TNode<T> *root) { if (root == NULL) { return 0; } else if ((root->m_left == NULL) && (root->m_right == NULL)) { return 1; } else { return CountLeafNumber2(root->m_left) + CountLeafNumber2(root->m_right); } } //函数功能:求二叉树叶子节点的个数(非递归版本) template <typename T> int BinaryTree<T>::CountLeafNumber3() { deque<TNode<T>* > d; int sum = 0; if (root != NULL) { d.push_back(root); } while (!d.empty()) { TNode<T> *front = d.front(); if ((front->m_right == NULL) && (front->m_left==NULL)) { ++sum; } if (front->m_left != NULL) { d.push_back(front->m_left); } if (front->m_right != NULL) { d.push_back(front->m_right); } d.pop_front(); } return sum; } //函数功能:交换二叉树的每一个节点的左右子树 template <typename T> void BinaryTree<T>::SwapTree(TNode<T> *root) { if (root == NULL) { return; } TNode<T> *temp; //交换左右子节点 temp = root->m_left; root->m_left = root->m_right; root->m_right = temp; //递归调用 if(root->m_left) SwapTree(root->m_left); if (root->m_right) SwapTree(root->m_right); } //函数功能:中序输出二叉树 template <typename T> void BinaryTree<T>::MiddleOrder(TNode<T> *root) { if(root == NULL) return; if(root->m_left != NULL) MiddleOrder(root->m_left); cout<<root->m_element<<" "; if (root->m_right != NULL) MiddleOrder(root->m_right); } //函数功能:判断两个二叉树是否相等 template <typename T> bool TestEqual(TNode<T> *left, TNode<T> *right) { if((left == NULL) || (right == NULL)) // 任意一个为空树 return false; if (left->m_element == right->m_element) //若当前结点相等,比较左右子结点 { return TestEqual(left->m_left, right->m_left) && TestEqual(left->m_right, right->m_right); } else //若当前结点不等,直接返回false return false; } //二叉树的比较:可以有先序、中序、后序的任意两个序列的比较来判断,任意两个相等,那就相等。 //函数功能:有中序和后序,构造二叉树 void CreateTree(char middleOrder[], char postOrder[], TNode<char>* &root) { int midLen = strlen(middleOrder); int posLen = strlen(postOrder); if(midLen == 0) { root = NULL; return; } char r = postOrder[posLen - 1]; //根结点元素值 root = new TNode<char>(r, NULL, NULL); char *middleLeft = new char[midLen]; char *middleRight = new char[midLen]; char *postLeft = new char[posLen]; char *postRight = new char[posLen]; memset(middleLeft, 0 , sizeof(middleLeft)); memset(middleRight, 0 ,sizeof(middleRight)); memset(postLeft, 0, sizeof(postLeft)); memset(postRight, 0, sizeof(postRight)); int i = 0; int j = 0; while (middleOrder[i] != r) { middleLeft[i] = middleOrder[i]; postLeft[i] = postOrder[i]; i++; } while (middleOrder[i+1] != '/0') { middleRight[j] = middleOrder[i+1]; postRight[j] = middleRight[i]; i++; j++; } CreateTree(middleLeft, postLeft, root->m_left); CreateTree(middleRight, postRight, root->m_right); } 一个递归创建二叉树的函数 /************************************************************************/ /* 函数功能:递归创建二叉树 输入参数:arr为输出字符数组,num为数组的元素个数,i为当前结点的位置 */ /************************************************************************/ TNode<char>* CreateTree(char arr[], int num, int i) { TNode<char> *root; if (i > num) { return NULL; } else { root = new TNode<char>(arr[i]); root->m_left = CreateTree(arr, num, 2*i+1); root->m_right = CreateTree(arr, num, 2*i+2); } return root; }