1: // 3_9重建二叉树.cpp : 定义控制台应用程序的入口点。
2: //
3:
4: #include "stdafx.h"
5:
6: #include
7: #define TREELEN 6
8:
9: using namespace std;
13: struct Node
14: {
15: Node *pLeft;
16: Node *pRight;
17: char chValue;
18: };
19:
20: void ReBuild(char *pPreOrder,
21: char *pInOrder,
22: int nTreeLen,
23: Node **pRoot) //pRoot是一个指向指针的指针
24: {
25: if(pPreOrder == NULL || pInOrder == NULL)
26: {
27: return;
28: }
29:
30: //获得前序遍历的第一个节点
31: Node *pTemp = new Node;
32: pTemp->chValue = *pPreOrder;
33: pTemp->pLeft = NULL;
34: pTemp->pRight = NULL;
35:
36: //如果根节点为空,把当前节点复制到根节点
37: if(*pRoot == NULL) //如果pRoot指向的根节点指针为NULL
38: {
39: *pRoot = pTemp;
40: }
41:
42: //如果当前树长度为1,那么已经是最后一个结点
43: if(nTreeLen == 1)
44: {
45: return;
46: }
47:
48: //寻找子树长度
49: char* pOrgInOrder = pInOrder;
50: char* pLeftEnd = pInOrder;
51: int nTempLen = 0;
52:
53: while(*pPreOrder != *pLeftEnd)
54: {
55: if(pPreOrder == NULL || pLeftEnd == NULL)
56: {
57: return;
58: }
59: nTempLen++;
60:
61: if(nTempLen > nTreeLen)
62: {
63: break;
64: }
65:
66: pLeftEnd++;
67: }
68:
69: int nLeftLen = 0;
70: nLeftLen = (int)(pLeftEnd - pOrgInOrder);
71:
72: int nRightLen = 0;
73: nRightLen = nTreeLen - nLeftLen -1;
74:
75: if(nLeftLen > 0)
76: {
77: ReBuild(pPreOrder+1, pInOrder, nLeftLen, &((*pRoot)->pLeft));
78: }
79:
80: if(nRightLen > 0)
81: {
82: ReBuild(pPreOrder + nLeftLen + 1, pInOrder + nLeftLen + 1, nRightLen, &((*pRoot)->pRight));
83: }
84:
85: return;
86: }
87:
90: void printInOrder(Node *current)//第一个*解析成Node指针,第二个*把Node指针解析成Node对象
91: {
92: if(current != NULL)
93: {
94: //printInOrder( &( (*current)->pLeft ) ); //注意这里的 &( (*current)->pLeft )
95:
96: printInOrder(current->pLeft);
97: cout<chValue<<" ";
98: printInOrder(current->pRight);
99: return;
100: }
101: }
102:
103: void printPreOrder(Node *current)
104: {
105:
106: if(current!=NULL)
107: {
108: cout<chValue<<" ";
109: printPreOrder(current->pLeft);
110: printPreOrder(current->pRight);
111: return ;
112: }
113: }
114:
115: void printPostOrder(Node *current)
116: {
117: if(current != NULL)
118: {
119: printPostOrder(current->pLeft);
120: printPostOrder(current->pRight);
121: cout<chValue<<" ";
122: return ;
123: }
124: }
125:
126: int _tmain(int argc, _TCHAR* argv[])
127: {
128: //char szPreOrder[TREELEN] = {'z','b','d','c','e','f'}; //非中序遍历结果,结果是错误的
129:
130: //原:
131: //char szPreOrder[TREELEN] = {'a','b','a','e','c','f'};
132: //char szInOrder[TREELEN] = {'d','b','a','e','c','f'};
133:
134: //有重复字符的结点:结果是错误的
135: char szPreOrder[TREELEN] = {'a','a','d','e','c','f'};
136: char szInOrder[TREELEN] = {'d','a','a','e','c','f'};
137:
138: Node *pRoot = NULL;
139: ReBuild(szPreOrder,szInOrder, TREELEN,&pRoot);
140:
141: cout<<"前序遍历 :";
142: printInOrder(pRoot);
143: cout<<endl;
144:
145: cout<<"中序遍历 :";
146: printPreOrder(pRoot);
147: cout<<endl;
148:
149: cout<<"后序遍历 :";
150: printPostOrder(pRoot);
151: cout<<endl;
152:
153: system("pause");return 0;
154: }
155: