java实现(构建二叉树+层序遍历)
输出二叉树的右视图
http://www.nowcoder.com/questionTerminal/c9480213597e45f4807880c763ddd5f0
1.递归构建二叉树(关键点是找到中序中根节点下标,这里我用HashMap存一下,这样每次查找都是O(1))
2.队列实现层序遍历(每一层维护两个变量,当前层的个数、下一层的个数,从而出队列的时候可以知道最右的元素)
以下是代码:
import java.util.*;
public class Solution {
//这个方法对建好的二叉树进行层序遍历
public int[] solve (int[] preOrder, int[] midOrder) {
// write code here
int len = preOrder.length;
TreeNode root = buildTree(preOrder,midOrder);
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
List<Integer> resList = new ArrayList<>();
int count = 1;
int next = 0;
while(!queue.isEmpty()){
for(int i = count; i > 0; i --){
TreeNode tempTreeNode = queue.poll();
if(tempTreeNode.left != null){
queue.add(tempTreeNode.left);
next ++;
}
if(tempTreeNode.right != null) {
queue.add(tempTreeNode.right);
next ++;
}
if(i == 1) resList.add(tempTreeNode.val);
}
count = next;
next = 0;
}
int[] resArr = new int[resList.size()];
for(int i = 0; i < resArr.length; i ++){
resArr[i] = resList.get(i);
}
return resArr;
}
//递归构建二叉树
public TreeNode buildTree(int[] preOrder, int[] inOrder) {
int len = preOrder.length;
if(len == 0) return null;
HashMap<Integer, Integer> mapOfIndex = new HashMap<>();
for (int i = 0; i < inOrder.length; i++) {
mapOfIndex.put(inOrder[i], i);
}
TreeNode root = treeInit(mapOfIndex, preOrder, 0, len - 1, inOrder, 0, len - 1);
return root;
}
//递归方法
public TreeNode treeInit(HashMap<Integer, Integer> mapOfIndex,
int[] preOrder,
int preBegin,
int preEnd,
int[] midOrder,
int midBegin,
int midEnd) {
TreeNode root = new TreeNode(preOrder[preBegin]);
//关键点:从中序中找到当前层根节点位置,根据这个位置划分左右子树元素
int indexOfRootInMidOrder = mapOfIndex.get(preOrder[preBegin]);
int lenOfLeft = indexOfRootInMidOrder - midBegin;
int lenOfRight = midEnd - indexOfRootInMidOrder;
TreeNode left = null;
TreeNode right = null;
if (lenOfLeft != 0) {
int preBeginLeft = preBegin + 1;
int preEndLeft = preBeginLeft + lenOfLeft - 1;
int midBeginLeft = midBegin;
int midEndLeft = indexOfRootInMidOrder - 1;
left = treeInit(mapOfIndex, preOrder, preBeginLeft, preEndLeft, midOrder, midBeginLeft, midEndLeft);
}
if (lenOfRight != 0) {
int preEndRight = preEnd;
int preBeginRight = preEndRight - lenOfRight + 1;
int midBeginRight = indexOfRootInMidOrder + 1;
int midEndRight = midEnd;
right = treeInit(mapOfIndex, preOrder, preBeginRight, preEndRight, midOrder, midBeginRight, midEndRight);
}
root.left = left;
root.right = right;
return root;
}
}
文远知行公司福利 544人发布
查看14道真题和解析