110.平衡二叉树
思路:
如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,当然是左子树高度和右子树高度相差。
分别求出左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则则返回-1,表示已经不是二叉树了
- 代码:
class Solution {
public boolean isBalanced(TreeNode root) {
return depth(root)!=-1;
}
public int depth(TreeNode root){
if(root==null)
return 0;
int left = depth(root.left);
int right = depth(root.right);
if(left==-1||right==-1)
return -1;
return Math.abs(left-right)>1?-1:Math.max(left,right)+1;
}
}
257.二叉树的所有路径
思路:
- DFS
在深度优先搜索遍历二叉树时,我们需要考虑当前的节点以及它的孩子结点。- 如果当前节点不是叶子节点,则在当前的路径末尾添加该节点,并继续递归遍历该节点的每一个孩子节点。
- 如果当前节点是叶子节点,则在当前路径末尾添加该节点后我们就得到了一条从根节点到叶子节点的路径,将该路径加入到答案即可。
代码:
public List<String> binaryTreePaths(TreeNode root) {
List<String> ans = new ArrayList<>();
findPaths(root," ",ans);
return ans;
}
private void findPaths(TreeNode root,String str,List<String> list){
if (root!=null){
StringBuilder stringBuilder = new StringBuilder(str);
stringBuilder.append(root.val);
if(root.left==null&&root.right==null)
list.add(stringBuilder.toString());
else {
stringBuilder.append("->");
findPaths(root.left,stringBuilder.toString(),list);
findPaths(root.right,stringBuilder.toString(),list);
}
}
}
- BFS
维护一个队列,存储节点以及根到该节点的路径。一开始这个队列里只有根节点。在每一步迭代中,我们取出队列中的首节点,如果它是叶子节点,则将它对应的路径加入到答案中。如果它不是叶子节点,则将它的所有孩子节点加入到队列的末尾。当队列为空时广度优先搜索结束,我们即能得到答案。
代码:
public List<String> binaryTreePaths(TreeNode root) {
List<String> paths = new ArrayList<String>();
if (root == null) {
return paths;
}
Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
Queue<String> pathQueue = new LinkedList<String>();
nodeQueue.offer(root);
pathQueue.offer(Integer.toString(root.val));
while (!nodeQueue.isEmpty()) {
TreeNode node = nodeQueue.poll();
String path = pathQueue.poll();
if (node.left == null && node.right == null) {
paths.add(path);
} else {
if (node.left != null) {
nodeQueue.offer(node.left);
pathQueue.offer(new StringBuffer(path).append("->").append(node.left.val).toString());
}
if (node.right != null) {
nodeQueue.offer(node.right);
pathQueue.offer(new StringBuffer(path).append("->").append(node.right.val).toString());
}
}
}
return paths;
}