#include <iostream> #include <vector> #include <list> using namespace std; // 节点结构体 typedef struct node { int data; node* leftChild; node* rightChild; bool leftVisited; bool rightVisited; node() { int data = -1; leftChild = NULL; rightChild = NULL; leftVisited = false; rightVisited = false; } }Node, *pNode; //****************************************************************************** // Name: CreateChild // Desc: 创建子树 //****************************************************************************** void CreateChild(Node* &root, vector<int>::iterator &beginIter, vector<int>::iterator &endIter) { if(beginIter != endIter) { int tempData = *beginIter++; if(tempData != -1) { root = new Node; root->data = tempData; CreateChild(root->leftChild, beginIter, endIter); // 创建左子树 CreateChild(root->rightChild, beginIter, endIter); // 创建右子树 } else { root = NULL; } } else { root = NULL; } } //****************************************************************************** // Name: CreateTree // Desc: 先序扩展序列创建一棵树(先序遍历,空节点用-1标识) //****************************************************************************** Node* CreateTree(Node* root, vector<int> &dataVec) { if(dataVec.size() < 1) return NULL; vector<int>::iterator beginIter = dataVec.begin(); vector<int>::iterator endIter = dataVec.end(); root = NULL; CreateChild(root, beginIter, endIter); return root; } //****************************************************************************** // Name: DisplayTree // Desc: 二叉显示 //****************************************************************************** void DisplayTree(Node* root) { if(root != NULL) { cout<<"node:"<<root->data<<" "; if(root->leftChild != NULL) { cout<<"leftChild:"<<root->leftChild->data<<" "; } if(root->rightChild != NULL) { cout<<"rightChild:"<<root->rightChild->data<<" "; } cout<<endl; DisplayTree(root->leftChild); DisplayTree(root->rightChild); } } //****************************************************************************** // Name: FirstVisite // Desc: 先根遍历(递归) //****************************************************************************** void FirstVisite(Node* root) { if(root != NULL) { cout<<root->data<<" "; FirstVisite(root->leftChild); FirstVisite(root->rightChild); } } //****************************************************************************** // Name: CenterVisite // Desc: 中根遍历(递归) //****************************************************************************** void CenterVisite(Node* root) { if(root != NULL) { CenterVisite(root->leftChild); cout<<root->data<<" "; CenterVisite(root->rightChild); } } //****************************************************************************** // Name: AfterVisite // Desc: 后根遍历(递归) //****************************************************************************** void AfterVisite(Node* root) { if(root != NULL) { AfterVisite(root->leftChild); AfterVisite(root->rightChild); cout<<root->data<<" "; } } //****************************************************************************** // Name: ResetTree // Desc: 重置二叉树,方便一次遍历 //****************************************************************************** void ResetTree(Node* root) { if(root != NULL) { root->leftVisited = false; root->rightVisited = false; ResetTree(root->leftChild); ResetTree(root->rightChild); } } //****************************************************************************** // Name: _FirstVisite // Desc: 先根遍历(非递归) //****************************************************************************** void _FirstVisite(Node* tree) { ResetTree(tree); typedef vector<Node*> NodeStack; NodeStack stack; stack.push_back(tree); // 初始化栈 while (stack.size() > 0) { Node* topNode = stack.back(); if (!topNode->leftVisited && !topNode->rightVisited) { cout<<topNode->data<<" "; } if (topNode->leftChild != NULL && !topNode->leftVisited) { stack.push_back(topNode->leftChild); topNode->leftVisited = true; } else if (topNode->rightChild != NULL && !topNode->rightVisited) { stack.push_back(topNode->rightChild); topNode->rightVisited = true; } else { stack.pop_back(); } } } //****************************************************************************** // Name: __FirstVisite // Desc: 非递归先根遍历思路二 //****************************************************************************** void __FirstVisite(Node* tree) { typedef vector<Node*> NodeStack; NodeStack stack; Node *curNode = tree; while(!stack.empty() || curNode != NULL) { while(curNode != NULL) { cout<<curNode->data<<" "; stack.push_back(curNode); curNode = curNode->leftChild; } if(!stack.empty()) { curNode = stack.back(); curNode = curNode->rightChild; stack.pop_back(); } } } //****************************************************************************** // Name: _CenterVisit // Desc: 中根遍历(非递归) //****************************************************************************** void _CenterVisite(Node* tree) { ResetTree(tree); typedef vector<Node*> NodeStack; NodeStack stack; stack.push_back(tree); // 初始化 while (stack.size() > 0) { Node* topNode = stack.back(); if (topNode->leftVisited && !topNode->rightVisited) { cout<<topNode->data<<" "; } if (topNode->leftChild != NULL && !topNode->leftVisited) { stack.push_back(topNode->leftChild); topNode->leftVisited = true; } else { if (topNode->rightChild != NULL && !topNode->rightVisited) { if (topNode->leftChild == NULL && topNode->rightChild != NULL) { cout<<topNode->data<<" "; // 单边只有右子节点 } stack.push_back(topNode->rightChild); topNode->rightVisited = true; } else { if (topNode->leftChild == NULL && topNode->rightChild == NULL) { cout<<topNode->data<<" "; } stack.pop_back(); } } } } //****************************************************************************** // Name: __CenterVisite // Desc: 非递归中根遍历思路二 //****************************************************************************** void __CenterVisite(Node* tree) { typedef vector<Node*> NodeStack; NodeStack stack; Node* curNode = tree; while(!stack.empty() || curNode != NULL) { while(curNode != NULL) { stack.push_back(curNode); curNode = curNode->leftChild; } if(!stack.empty()) { curNode = stack.back(); cout<<curNode->data<<" "; curNode = curNode->rightChild; stack.pop_back(); } } } //****************************************************************************** // Name: _AfterVisite // Desc: 后序遍历(非递归) //****************************************************************************** void _AfterVisite(Node* tree) { ResetTree(tree); typedef vector<Node*> NodeStack; NodeStack stack; stack.push_back(tree); // 初始化 while (stack.size()) { Node* topNode = stack.back(); if (topNode->leftVisited && topNode->rightVisited) { cout<<topNode->data<<" "; } if (topNode->leftChild != NULL && !topNode->leftVisited) { stack.push_back(topNode->leftChild); topNode->leftVisited = true; } else if (topNode->rightChild != NULL && !topNode->rightVisited) { stack.push_back(topNode->rightChild); topNode->rightVisited = true; } else { // 针对叶子节点或者单边子节点的情况 if (topNode->leftChild == NULL || topNode->rightChild == NULL) { cout<<topNode->data<<" "; } stack.pop_back(); } } } //****************************************************************************** // Name: __AfterVisite // Desc: 非递归后根遍历思路二 //****************************************************************************** void __AfterVisite(Node* tree) { typedef vector<Node*> StackNode; StackNode stack; Node *curNode; // 当前结点 Node *preNode = NULL; // 前一次访问的结点 stack.push_back(tree); while(!stack.empty()) { curNode = stack.back(); if((curNode->leftChild == NULL && curNode->rightChild == NULL) || (preNode != NULL && (preNode == curNode->leftChild || preNode == curNode->rightChild))) { cout<<curNode->data<<" "; // 如果当前结点没有孩子结点或者孩子节点都已被访问过 stack.pop_back(); preNode = curNode; } else { if(curNode->rightChild != NULL) { stack.push_back(curNode->rightChild); } if(curNode->leftChild != NULL) { stack.push_back(curNode->leftChild); } } } } //****************************************************************************** // Name: LevelVisite // Desc: 层次遍历 //****************************************************************************** void LevelVisite(Node* tree) { typedef list<Node*> QueueNode; QueueNode queue; queue.push_back(tree); while (queue.size() > 0) //由上至下,由左至右 { Node* curNode = queue.front(); queue.pop_front(); cout<<curNode->data<<" "; if (curNode->leftChild != NULL) { queue.push_back(curNode->leftChild); } if (curNode->rightChild != NULL) { queue.push_back(curNode->rightChild); } } } //****************************************************************************** // Name: CaculateLeafNum // Desc: 统计叶子节点的数量 //****************************************************************************** int CaculateLeafNum(Node* tree) { if (tree == NULL) { return 0; } if (tree->leftChild == NULL && tree->rightChild == NULL) //孤立点 { return 1; } //递归计算 int sum = 0; sum += CaculateLeafNum(tree->leftChild); sum += CaculateLeafNum(tree->rightChild); return sum; } //****************************************************************************** // Name: CaculateAllNodeNum // Desc: 统计所有节点数量 //****************************************************************************** int CaculateAllNodeNum(Node* tree) { /*static int sum = 0; if(tree != NULL) { sum += 1; CaculateAllNodeNum(tree->leftChild); CaculateAllNodeNum(tree->rightChild); }*/ int sum = 0; if (tree != NULL) { sum = 1; sum += CaculateAllNodeNum(tree->leftChild); sum += CaculateAllNodeNum(tree->rightChild); } return sum; } //****************************************************************************** // Name: CaculateDepth // Desc: 计算二叉树的深度 //****************************************************************************** int CaculateDepth(Node* tree) { int leftDepth = 0; int rightDepth = 0; if(tree != NULL) { leftDepth = 1; leftDepth += CaculateDepth(tree->leftChild); rightDepth = 1; rightDepth += CaculateDepth(tree->rightChild); } return leftDepth > rightDepth ? leftDepth : rightDepth; } //****************************************************************************** // Name: CaculateWidth // Desc: 计算二叉树的宽度 //****************************************************************************** int CaculateWidth(Node* tree) { if (tree == NULL) { return 0; } typedef list<Node*> QueueNode; QueueNode queue; unsigned int width = 0; queue.push_back(tree); while (queue.size() > 0) { unsigned int size = queue.size(); for (unsigned int i = 0; i < size; ++i) // 上一层的节点全部出列,并压入下一层节点 { Node* curNode = queue.front(); queue.pop_front(); if (curNode->leftChild != NULL) { queue.push_back(curNode->leftChild); } if (curNode->rightChild != NULL) { queue.push_back(curNode->rightChild); } } width = max(width, size); // 与每一个size比较,取最大者 } return width; } //****************************************************************************** // Name: Release // Desc: 释放资源 //****************************************************************************** void Release(Node* tree) { if(tree != NULL) { Release(tree->leftChild); Release(tree->rightChild); delete tree; tree = NULL; } } int main() { // 数据输入 vector<int> dataVec; int tempValue; cout<<"请输入二叉树的先序扩展序列(-1为空):"<<endl; while(cin>>tempValue) { dataVec.push_back(tempValue); } // 二叉树的创建 Node* root = NULL; root = CreateTree(root, dataVec); // 二叉显示 DisplayTree(root); // 递归先根遍历 FirstVisite(root); cout<<endl; // 递归中根遍历 CenterVisite(root); cout<<endl; // 递归后根遍历 AfterVisite(root); cout<<endl; cout<<"----------------------------"<<endl; // 非递归先根遍历 _FirstVisite(root); cout<<endl; // 非递归先根遍历二 __FirstVisite(root); cout<<endl; // 非递归中根遍历 _CenterVisite(root); cout<<endl; // 非递归中根遍历思路二 __CenterVisite(root); cout<<endl; // 非递归后根遍历 _AfterVisite(root); cout<<endl; // 非递归后根遍历思路二 __AfterVisite(root); cout<<endl; // 层次遍历 LevelVisite(root); cout<<endl; // 计算叶子节点数量 cout<<CaculateLeafNum(root)<<endl; // 计算所有节点数量 cout<<CaculateAllNodeNum(root)<<endl; // 计算二叉树深度 cout<<CaculateDepth(root)<<endl; // 计算二叉树宽度 cout<<CaculateWidth(root)<<endl; // 释放资源 Release(root); system("pause"); return 0; }
其他操作:
Node* midLastToTree(const string& midIn, const string& lastIn)// 已知二叉树中序遍历和 { //后序遍历序列,求二叉树的二叉链表结构 if (midIn.empty() || lastIn.empty()) { return 0; } char rootC = *(lastIn.end() - 1); // 找出根结点 // 把字符串midIn分成两部分 string::size_type rootIndex = midIn.find_first_of(rootC); string leftMidIn = midIn.substr(0, rootIndex); string rightMidIn = midIn.substr(rootIndex+1); // 把字符串lastIn也分成两部分 string leftLastIn; string rightLastIn; string::const_iterator curIter = lastIn.begin(); string::const_iterator endIter = lastIn.end(); for (; curIter!=endIter; ++curIter) { char c = *curIter; if (leftMidIn.find_first_of(c)!=string::npos) { leftLastIn.push_back(c); } else if (rightMidIn.find_first_of(c)!=string::npos) { rightLastIn.push_back(c); } } Node* tree = new Node; tree->c = rootC; // 递归 tree->left = midLastToTree(leftMidIn, leftLastIn); tree->right = midLastToTree(rightMidIn, rightLastIn); return tree; } Node* firstMidToTree(const string& midIn, const string firstIn)// 已知二叉树中序遍历和 { //先序遍历序列,求二叉树的二叉链表结构 if (midIn.empty() || firstIn.empty()) { return 0; } char rootC = *firstIn.begin(); // 把字符串midIn分成两部分 string::size_type rootIndex = midIn.find_first_of(rootC); string leftMidIn = midIn.substr(0, rootIndex); string rightMidIn = midIn.substr(rootIndex+1); // 把字符串firstIn分成两部分 string leftFirstIn, rightFirstIn; string::const_iterator curIter = firstIn.begin(); string::const_iterator endIter = firstIn.end(); while (curIter != endIter) { char c = *curIter++; if (leftMidIn.find_first_of(c)!=string::npos) { leftFirstIn.push_back(c); } else if (rightMidIn.find_first_of(c)!=string::npos) { rightFirstIn.push_back(c); } } Node* tree = new Node; tree->c = rootC; // 递归 tree->left = firstMidToTree(leftMidIn, leftFirstIn); tree->right = firstMidToTree(rightMidIn, rightFirstIn); return tree; }
非递归后根遍历思路三:
void postOrder2(BinTree *root) //非递归后序遍历 { stack<BTNode*> s; BinTree *p=root; BTNode *temp; while(p!=NULL||!s.empty()) { while(p!=NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点 { BTNode *btn=(BTNode *)malloc(sizeof(BTNode)); btn->btnode=p; btn->isFirst=true; s.push(btn); p=p->lchild; } if(!s.empty()) { temp=s.top(); s.pop(); if(temp->isFirst==true) //表示是第一次出现在栈顶 { temp->isFirst=false; s.push(temp); p=temp->btnode->rchild; } else //第二次出现在栈顶 { cout<<temp->btnode->data<<" "; p=NULL; } } } }