代码随想录训练营第12天(休息日)|剑指 Offer 07. 重建二叉树
)
[剑指 Offer 07. 重建二叉树](https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/
思路
其实常用思路是分治法,但这样要用到递归就很讨厌。
所以向官方题解学习了迭代法。
代码
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || preorder.length == 0) {
return null;
}
int i, j, n;
n = preorder.length;
j = 0;
Stack<TreeNode> st = new Stack<>();
TreeNode root = new TreeNode(preorder[0]);
TreeNode node;
int preorderVal, inorderVal;
st.push(root);
for (i = 1; i < n; ++i) {
preorderVal = preorder[i];
inorderVal = inorder[j];
node = st.peek();
if (node.val != inorderVal) {
node.left = new TreeNode(preorderVal);
st.push(node.left);
} else {
while(!st.isEmpty() && st.peek().val == inorder[j]) {
node = st.pop();
++j;
}
node.right = new TreeNode(preorderVal);
st.push(node.right);
}
}
return root;
}
}
总结
迭代法对前序遍历和中序遍历之间的联系有更细节的展示,连续的左子树节点,在前序和中序排列中是完全相反的,这个性质可以方便我们追溯到上一个拥有右子树的节点。