void postOrder(int root,int start,int end) { if (start > end) return; int index = start; while (inOrder[index] != preOrder[root] ) index++; postOrder(root + 1, start, index - 1); postOrder(root + index - start + 1, index + 1, end); cout << preOrder[root]; return; }
這時利用前序中序直接輸出後序的函數。直接把輸出語句改爲將數據賦值到節點,就變成一個建樹函數。函數
void pre_order(int root,int start,int end) { if (start > end) return; int index = start; while (inOrder[index] != postOrder[root]) index++; cout << postOrder[root]; pre_order(root - end + index - 1, start, index - 1); pre_order(root - 1, index + 1, end); return; }
做用相同,改爲了後序中序出前序。post
參數意義:root爲前序(後序)中根節點的位置,start和end是中序的起點下標和終點下標;code
遞歸出口:當發現end比start小,說明已經完成,能夠退出了;遞歸
遞歸主體:class
令index爲start,自加,直到找到根節點在中序序列的位置。總結
輸出或者建樹操做……數據
左子樹參數:while
前轉後co
root:root+1(前序特色)return
start:start
end:index-1(根節點座標前一個是左子樹的end)
後轉前
root:root-end+index-1(計算右子樹長度爲end-index,減掉以後-1得root座標)
start:start
end=index-1
右子樹參數
前轉後
root:root+index-start+1(左子樹長度爲index-start,加上去以後+1得root座標)
start:index+1
end:end
後轉前
root:root-1(後序特色)
start:index+1
end:end
而後return;
總結:
將index找到以後,左子樹長度爲index-start,右子樹長度爲end-index。本身分析是是左是右,而後root+length以後再+1或者root-length以後-1;