面試題6 重建二叉樹

2021-08-02 18:42:28 字數 3797 閱讀 3068

/*** 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二節樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

**@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...