面试题 04.02. 最小高度树
题目
要使二叉搜索树高度最小,应该尽量平衡两边高度,当树中的任意结点的左右子树高度差都不超过 1 时,整棵树的深度最小 --> 即创建平衡二叉树。
问题转化为怎样创建平衡二叉树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return helper(nums,0,nums.size());
}
TreeNode* helper(vector<int>& nums,int l,int r){
if(l==r){
return NULL;
}
int mid=l+(r-l)/2;
TreeNode* node=new TreeNode(nums[mid]);
node->left=helper(nums,l,mid);
node->right=helper(nums,mid+1,r);
return node;
}
};
226. 翻转二叉树
【一看就会,一用就废…】
方法一:递归
递归获取左右节点,root直接重新连接。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root==null){
return root;
}
TreeNode right=invertTree(root.right);
TreeNode left=invertTree(root.left);
root.left=right;
root.right=left;
return root;
}
}
方法二:迭代
在原树上改变左右节点。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) return null;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode current = queue.poll();
TreeNode temp = current.left;
current.left = current.right;
current.right = temp;
if (current.left != null) queue.add(current.left);
if (current.right != null) queue.add(current.right);
}
return root;
}
}