二叉树的遍历及其应用

来源:互联网 发布:轩辕世界神兽进化数据 编辑:程序博客网 时间:2024/06/05 21:08
#include <iostream>#include <stack>using namespace std;typedef int ElemType;typedef struct TreeNode *BinTree;typedef BinTree Position;typedef struct TreeNode       //二叉树的表示{ElemType Data;BinTree Left;BinTree Right;};//二叉树的几种遍历//先序遍历void PreOrderTraversal(BinTree BT){if (BT){cout << BT->Data << " ";PreOrderTraversal(BT->Left);PreOrderTraversal(BT->Right);}}//中序遍历void InOrderTraversal(BinTree BT){if (BT){InOrderTraversal(BT->Left);cout << BT->Data << " ";InOrderTraversal(BT->Right);}}//后序遍历void PostOrderTraversal(BinTree BT){if (BT){PostOrderTraversal(BT->Left);PostOrderTraversal(BT->Right);cout << BT->Data << " ";}}//前序遍历非递归算法void PreOrderTraversal(BinTree BT){stack<BinTree> S;while (BT || !S.empty()){while (BT){S.push(BT);cout << BT->Data << " ";BT = BT->Left;}if (!S.empty()){BT = S.top();S.pop();BT = BT->Right;}}}//中序遍历非递归算法void InOrderTraversal(BinTree BT){stack<BinTree> S;while (BT || !S.empty()){while (BT){S.push(BT);BT = BT->Left;}if (!S.empty()){BT = S.top();cout << BT->Data << " ";S.pop();BT = BT->Right;}}}//后序遍历非递归算法void PostOrderTraversal(BinTree BT){stack<BinTree> S;BinTree curr = BT;   //指向当前要检查的节点BinTree previsited = NULL; //指向前一个被访问的节点while (curr != NULL || !S.empty())  //栈为空时结束{while (curr != NULL) //一直向左走直到空{S.push(curr);curr = curr->Left;}curr = S.top();//当前节点的右孩子如果为空或者已经被访问,则访问当前节点if (curr->Right == NULL || curr->Right == previsited){cout << curr->Data << " ";previsited = curr;S.pop();curr = NULL;}elsecurr = curr->Right; //否则访问右孩子}}//层序遍历二叉树void LevelOrderTraversal(BinTree BT){Queue Q;if (!BT) return; //若是空树则直接返回Q = CreateQueue(MaxSize); //创建并初始化队列QAddQ(Q, BT);while (!IsEmptyQ(Q)){BinTree T = DeleteQ(Q);cout << T->Data << endl;  //访问取出队列的结点if (T->Left) AddQ(Q, T->Left);if (T->Right) AddQ(Q, T->Right);}}//输出二叉树的叶子结点void PreOrderPrintLeaves(BinTree BT){if (BT){if (!BT->Left && !BT->Right)cout << BT->Data << " ";PreOrderTraversal(BT->Left);PreOrderTraversal(BT->Right);}}//求二叉树的高度int PostOrderGetHeight(BinTree BT){if (BT){int HL = PostOrderGetHeight(BT->Left);int HR = PostOrderGetHeight(BT->Right);int MaxH = HL > HR ? HL : HR; //左右子树较大的深度return MaxH + 1;              //返回树的深度}elsereturn 0;}//按照先序构造二叉树void CreateBinTree(BinTree &root){char ch;cin >> ch;if (ch == ' ')root = NULL;else{root = new struct TreeNode;root->Data = ch;CreateBinTree(root->Left);CreateBinTree(root->Right);}}//按照层序生成二叉树算法BinTree CreateBinTree(){Queue Q = CreateQueue(MaxSize); //生成一个队列int data;cin >> data; //生成一个队列if (data) //分配根结点单元,并将结点地址入队{BinTree BT = new struct TreeNode;BT->Data = data;AddQ(Q, BT);}else return NULL; //若第1个数据就是0,返回空树while (!IsEmptyQ(Q)){BinTree T = DeleteQ(Q); //从队列中取出一结点地址cin >> data; //读入T的左孩子if (!data)T->Left = NULL;else          //分配新结点,作为出队结点左孩子,新结点入队{T->Left = new struct TreeNode;T->Left->Data = data;AddQ(Q, T->Left);}cin >> data; //读入T的右孩子if (!data)T->Right = NULL;else          //分配新结点,作为出队结点左孩子,新结点入队{T->Right = new struct TreeNode;T->Right->Data = data;AddQ(Q, T->Right);}}return BT;}

0 0
原创粉丝点击