劍指offer 建立二叉樹

2021-09-03 02:09:55 字數 1736 閱讀 2423

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

邏輯分析:

二叉樹的前序遍歷順序是:先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。

中序遍歷順序是:中序遍歷根節點的左子樹,然後是訪問根節點,最後中序遍歷右子樹

所以有:

1、二叉樹的前序遍歷序列(的第乙個值)一定是該樹的根節點

2、中序遍歷序列中根節點前面一定是該樹的左子樹,後面是該樹的右子樹

特點:程式之間或間接呼叫自身

適應於:子問題與原問題相似(即將大型複雜的問題層層轉化為與原問題相似的規模較小的問題來解決)

**組成:邊界條件,遞迴前進段,遞迴返回段---------------邊界條件不滿足時遞迴前進、滿足時遞迴返回

遞迴練習:

1、求階乘

int factorial(int val)

return res;

}int main()

解析:

2、將乙個int型陣列倒序輸出,例如輸入陣列,輸出陣列;

**為:

void rev(const vector&v, int pos, vector&res)

int main()

; vectorres;

rev(v, 0, res);

for (auto c : res)

cout << c << endl;

return 0;

}

解析:

3、計算二叉樹節點數值之和(節點數值大於零)

struct treenode 

};int sum(treenode *root)

}

解析:

所以本題:

/**

* definition for binary tree

* struct treenode

* };

*/class solution , vin_right{}, pre_left{}, pre_right{};

len = vin.size();

vin_index = len;

if (len == 0) return null;

else

vin_index = temp;

for (temp = 0; temp < len; temp++)

else if (temp > vin_index)

else;

}treenode* tn = new treenode(pre[0]);

tn->left = reconstructbinarytree(pre_left, vin_left);

tn->right = reconstructbinarytree(pre_right, vin_right);

return tn;

} }};

或者:

public class solution

//前序遍歷和中序遍歷序列

private treenode reconstructbinarytree(int pre,int startpre,int endpre,int in,int startin,int endin)

return root;

}}

劍指offer 二叉樹 二叉樹搜尋樹

package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...

劍指offer 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹 1 重複遍歷結點 參考上一題求二叉樹的深度,先求出根結點的左右子樹的深度,然後判斷它們的深度相差不超過1,如果否,則不是一棵二叉樹 如果是,再用同樣的方法分別判斷左子樹和右子樹是否為平衡二叉樹,如果都是,則這就是一棵平衡二叉樹。但上面的方法在判斷子樹是否...

劍指offer 重建二叉樹

重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...