/*** 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二節樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
**@param preorder 前序遍歷
*@param inorder 中序遍歷
*@return 樹的根結點
*/public
static binarytreenode construct(int preorder, int inorder)
return construct(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}/**
* 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二節樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
**@param preorder 前序遍歷
*@param ps 前序遍歷的開始位置
*@param pe 前序遍歷的結束位置
*@param inorder 中序遍歷
*@param is 中序遍歷的開始位置
*@param ie 中序遍歷的結束位置
*@return 樹的根結點
*/public
static binarytreenode construct(int preorder, int ps, int pe, int inorder, int is, int ie)
// 取前序遍歷的第乙個數字,就是當前的根結點
int value = preorder[ps];
int index = is;
// 在中序遍歷的陣列中找根結點的位置
while (index <= ie && inorder[index] != value)
// 如果在整個中序遍歷的陣列中沒有找到,說明輸入的引數是不合法的,丟擲異常
if (index > ie)
// 建立當前的根結點,並且為結點賦值
binarytreenode node = new binarytreenode();
node.value = value;
// 遞迴構建當前根結點的左子樹,左子樹的元素個數:index-is+1個
// 左子樹對應的前序遍歷的位置在[ps+1, ps+index-is]
// 左子樹對應的中序遍歷的位置在[is, index-1]
node.left = construct(preorder, ps + 1, ps + index - is, inorder, is, index - 1);
// 遞迴構建當前根結點的右子樹,右子樹的元素個數:ie-index個
// 右子樹對應的前序遍歷的位置在[ps+index-is+1, pe]
// 右子樹對應的中序遍歷的位置在[index+1, ie]
node.right = construct(preorder, ps + index - is + 1, pe, inorder, index + 1, ie);
// 返回建立的根結點
return node;
}// 中序遍歷二叉樹
public
static
void
printtree(binarytreenode root)
}// 普通二叉樹
// 1
// / \
// 2 3
// / / \
// 4 5 6
// \ /
// 7 8
private
static
void
test1() ;
int inorder = ;
binarytreenode root = construct(preorder, inorder);
printtree(root);
}// 所有結點都沒有右子結點
// 1
// /
// 2
// /
// 3
// /
// 4
// /
// 5
private
static
void
test2() ;
int inorder = ;
binarytreenode root = construct(preorder, inorder);
printtree(root);
}// 所有結點都沒有左子結點
// 1
// \
// 2
// \
// 3
// \
// 4
// \
// 5
private
static
void
test3() ;
int inorder = ;
binarytreenode root = construct(preorder, inorder);
printtree(root);
}// 樹中只有乙個結點
private
static
void
test4() ;
int inorder = ;
binarytreenode root = construct(preorder, inorder);
printtree(root);
}// 完全二叉樹
// 1
// / \
// 2 3
// / \ / \
// 4 5 6 7
private
static
void
test5() ;
int inorder = ;
binarytreenode root = construct(preorder, inorder);
printtree(root);
}// 輸入空指標
private
static
void
test6()
// 輸入的兩個序列不匹配
private
static
void
test7() ;
int inorder = ;
binarytreenode root = construct(preorder, inorder);
printtree(root);
}public
static
void
main(string args)
}
面試題6 重建二叉樹
面試題6 題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,重建出該二叉樹。不包含重複數字。前序遍歷的第乙個結果就是根節點,中序遍歷中根節點前面的節點就是左子樹,後面的節點就是右子樹。然後遞迴的構建左右子樹。binarytreenode constructbinarynode int startpreo...
面試題6 重建二叉樹
templatestruct binarytreenode 對比二叉樹的圖形和其兩個遍歷序列來看,可以發現在前序遍歷序列中第乙個數字總是二叉樹的根節點的值,然後在中序遍歷序列中找到該值,它的前面就是它左子樹上節點值的集合,後面就是它右子樹上節點值的集合。由此就可以遞迴地在這兩個集合中建立二叉樹。bi...
面試題6 重建二叉樹
二叉樹中最重要的操作莫過於遍歷,即按照某一順序訪問樹中的所有結點。以下這三種遍歷都有遞迴和迴圈兩種實現方法,每一種遍歷的遞迴都要比迴圈實現簡潔地多。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。遞迴實現 void preo...