首页 > 代码库 > 对树的一些操作.比如遍历.比如.根据先序和中序创建二叉树
对树的一些操作.比如遍历.比如.根据先序和中序创建二叉树
1 #include "stdafx.h" 2 #include<string> 3 #include<iostream> 4 #include<stack> 5 6 using namespace std; 7 8 struct BinaryTreeNode 9 { 10 int m_nValue; 11 BinaryTreeNode* m_pLeft; 12 BinaryTreeNode* m_pRight; 13 }; 14 15 void beforeTraverse(BinaryTreeNode *root) 16 { 17 if(root!=NULL) 18 { 19 cout<<root->m_nValue<<" "; 20 beforeTraverse(root->m_pLeft); 21 beforeTraverse(root->m_pRight); 22 } 23 } 24 25 void PreOrder(BinaryTreeNode* pRoot) 26 {//迭代先序遍历 27 if (pRoot==NULL) 28 return; 29 std::stack<BinaryTreeNode*> S; 30 BinaryTreeNode *p=pRoot; //二叉树分左右,所以光有栈不行,合理的运用遍历指针是关键之一 31 while(p!=NULL) 32 { 33 cout<<p->m_nValue<<" "; 34 if (p->m_pRight!=NULL) 35 S.push(p->m_pRight); 36 if (p->m_pLeft!=NULL) 37 p=p->m_pLeft; 38 else 39 { 40 if (S.empty()) 41 break; 42 p=S.top(); 43 S.pop(); 44 } 45 } 46 } 47 48 49 50 51 void midTraverse(BinaryTreeNode *root) 52 { 53 if(root!=NULL) 54 { 55 midTraverse(root->m_pLeft); 56 cout<<root->m_nValue<<" "; 57 midTraverse(root->m_pRight); 58 } 59 } 60 61 62 void InOrder(BinaryTreeNode* pRoot) 63 {//迭代中序遍历 64 if (pRoot==NULL) 65 return; 66 std::stack<BinaryTreeNode*> S; 67 BinaryTreeNode *p=pRoot; 68 do 69 { 70 while(p!=NULL) 71 { 72 S.push(p); 73 p=p->m_pLeft; 74 } 75 //若进行到这里左子树为空 76 if (!S.empty())//Stack不空时退栈,然后访问该元素 77 { 78 p=S.top(); 79 cout<<p->m_nValue<<" "; 80 S.pop(); 81 p=p->m_pRight; 82 } 83 } while (p!=NULL||!S.empty()); 84 //这里的p==NULL表示右子树为空,然后堆栈如果也空的话,才是处理完毕 85 } 86 87 void backTraverse(BinaryTreeNode *root) 88 { 89 if(root!=NULL) 90 { 91 backTraverse(root->m_pLeft); 92 backTraverse(root->m_pRight); 93 cout<<root->m_nValue<<" "; 94 } 95 } 96 97 void PostOrder(BinaryTreeNode* pRoot) 98 { 99 if (pRoot==NULL)100 return;101 std::pair<BinaryTreeNode*,char> w;102 std::stack<std::pair<BinaryTreeNode*,char> > S;103 BinaryTreeNode *p=pRoot; 104 do 105 {106 while(p!=NULL) //左子树经过节点加L进栈107 {108 w.first=p;109 w.second=‘L‘;110 S.push(w);111 p=p->m_pLeft;112 }113 bool continuel=true; //继续循环标志,用于L改为R的时候就开始向右遍历114 while (continuel && !S.empty()) //用一个break语句也能实现循环标志continuel的功能115 {116 w=S.top();117 S.pop();118 p=w.first;119 if (w.second==‘L‘) //标记为L表示左子树遍历完120 {121 w.second=‘R‘;122 S.push(w);123 continuel=false;124 p=p->m_pRight;125 }126 else127 cout<<(p->m_nValue)<<" "; //如果标记为R,表示右子树遍历完128 }129 }while (!S.empty());130 }131 132 BinaryTreeNode* createTree(int *leftArr,int leftarrl,int leftarrr,int *midArr,int midarrl,int midarrr)133 {134 if(leftarrl<=leftarrr){135 BinaryTreeNode* root =new BinaryTreeNode;136 root->m_nValue= http://www.mamicode.com/leftArr[leftarrl];//取先序遍历的第一个元素作为根节点137 //取出这个结点以后..要在midArr里面找到这个节点138 int temIndex = -1;139 140 for(int i = midarrl;i<=midarrr;++i)141 {142 if(midArr[i]==leftArr[leftarrl])143 {144 temIndex =i;145 break;146 }147 }148 if(temIndex==-1)149 {150 cout<<"数据有误"<<endl;151 throw std::exception("valid data");152 153 }154 int lengthl = temIndex-midarrl;155 root->m_pLeft = createTree(leftArr,leftarrl+1,leftarrl+lengthl,midArr,midarrl,temIndex-1);156 root->m_pRight =createTree(leftArr,leftarrl+lengthl+1,leftarrr,midArr,temIndex+1,midarrr);157 return root;158 }159 else160 {161 return NULL;162 }163 }164 BinaryTreeNode* cTree(int *leftArr,int *midArr,int len)165 {166 return createTree(leftArr,0,len-1,midArr,0,len-1);167 }168 169 170 171 172 int _tmain(int argc, _TCHAR* argv[])173 {174 175 BinaryTreeNode *roots = new BinaryTreeNode;176 roots->m_nValue=http://www.mamicode.com/1;177 BinaryTreeNode *lchild = new BinaryTreeNode;178 lchild->m_nValue = http://www.mamicode.com/2;179 lchild->m_pLeft=lchild->m_pRight=NULL;180 BinaryTreeNode *rchild = new BinaryTreeNode;181 rchild->m_nValue = http://www.mamicode.com/3;182 rchild->m_pLeft=rchild->m_pRight=NULL;183 roots->m_pLeft = lchild;184 roots->m_pRight = rchild; 185 186 beforeTraverse(roots);187 cout<<endl;188 midTraverse(roots);189 cout<<endl;190 backTraverse(roots);191 cout<<endl;192 193 //下面根据先序和中序构建一棵树194 const int len = 8;195 int left[]={1,2,4,7,3,5,6,8};196 int mid[]={4,7,2,1,5,3,8,6};197 BinaryTreeNode *root;198 root = cTree(left,mid,len);199 200 cout<<"先序遍历:";201 beforeTraverse(root);202 cout<<endl;203 cout<<"迭代版先序遍历:";204 PreOrder(root);205 cout<<endl;206 cout<<"中序遍历:";207 midTraverse(root);208 cout<<endl;209 cout<<"迭代中序遍历:";210 InOrder(root);211 cout<<endl;212 cout<<"后序遍历:";213 backTraverse(root);214 cout<<endl;215 cout<<"迭代后序遍历:";216 PostOrder(root);217 cout<<endl;218 return 0;219 }
对树的一些操作.比如遍历.比如.根据先序和中序创建二叉树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。