数据结构 二叉树OJ题
文章目录
- 数据结构 二叉树OJ题
- 1. 检查两颗二叉树是否相同
- 2. 判断树是否为另一个树的子树
- 3. 翻转二叉树
- 4. 平衡二叉树
- 5. 对称二叉树
- 6. 二叉树遍历
- 7. 二叉树层序遍历
- 8. 最近公共祖先
- 9. 二叉树创建字符串
- 10. 非递归方式实现前序遍历
- 11. 非递归方式实现中序遍历
- 12. 非递归方式实现后序遍历
结合之前所学的二叉树知识,我们来刷一些OJ题巩固一下:
1. 检查两颗二叉树是否相同
OJ链接
代码示例:
class Solution {
public boolean isSameTree(TreeNode p,TreeNode q) {
if ((p == null && q != null) || (p != null && q == null)) {
return false;
}
if (p == null && q == null) {
return true;
}
if (p.val != q.val) {
return false;
}
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
}
2. 判断树是否为另一个树的子树
OJ链接
代码示例:
class Solution {
public boolean isSameTree(TreeNode p,TreeNode q) {
if ((p == null && q != null) || (p != null && q == null)) {
return false;
}
if (p == null && q == null) {
return true;
}
if (p.val != q.val) {
return false;
}
return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
}
public boolean isSubtree(TreeNode root,TreeNode subRoot) {
if (root == null || subRoot == null) {
return false;
}
if (isSameTree(root,subRoot)) {
return true;
}
if (isSubtree(root.left,subRoot)) {
return true;
}
if (isSubtree(root.right,subRoot)) {
return true;
}
return false;
}
}
3. 翻转二叉树
OJ链接
代码示例:
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
if (root.left == null && root.right == null) {
return root;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
}
4. 平衡二叉树
OJ链接
代码示例:
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
int leftH = getHeight(root.left);
int rightH = getHeight(root.right);
if (Math.abs(leftH-rightH) > 1) {
return false;
}
return isBalanced(root.left) && isBalanced(root.right);
}
public int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
int leftNode = getHeight(root.left);
int rightNode = getHeight(root.right);
return leftNode > rightNode ? leftNode + 1 : rightNode + 1;
}
}
5. 对称二叉树
OJ链接
代码示例:
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isSymmetricChild(root.left,root.right);
}
private boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree) {
if (leftTree == null && rightTree == null) {
return true;
}
if ((leftTree == null && rightTree != null) || (leftTree != null && rightTree == null)) {
return false;
}
if (leftTree.val != rightTree.val) {
return false;
}
return isSymmetricChild(leftTree.left,rightTree.right) && isSymmetricChild(leftTree.right,rightTree.left);
}
}
6. 二叉树遍历
[OJ链接]:
代码示例:
import java.util.Scanner;
public class Main {
public static int i = 0;
static class TreeNode {
char val;
TreeNode left;
TreeNode right;
public TreeNode(char val) {
this.val = val;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s1 = in.nextLine();
TreeNode root = createTree(s1);
isOrder(root);
}
public static TreeNode createTree(String s) {
if (s.charAt(i) != '#') {
TreeNode root = new TreeNode(s.charAt(i));
i++;
root.left = createTree(s);
root.right = createTree(s);
return root;
}
else {
i++;
}
return null;
}
public static void isOrder(TreeNode root) {
if (root == null) {
return;
}
isOrder(root.left);
System.out.print(root.val + " ");
isOrder(root.right);
}
}
7. 二叉树层序遍历
OJ链接
代码示例:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ret1 = new LinkedList<>();
Queue<TreeNode> queue = new LinkedList<>();
if (root == null) {
return ret1;
}
queue.offer(root);
while(!queue.isEmpty()) {
List<Integer> list = new LinkedList<>();
int size = queue.size();
while(size != 0) {
TreeNode cur = queue.poll();
size--;
System.out.print(cur.val + " ");
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
list.add(cur.val);
}
ret1.add(list);
}
return ret1;
}
}
8. 最近公共祖先
OJ链接
代码示例:
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null) {
return null;
}
if (root == p || root == q) {
return root;
}
TreeNode leftTree = lowestCommonAncestor(root.left,p,q);
TreeNode rightTree = lowestCommonAncestor(root.right,p,q);
if (leftTree != null && rightTree != null) {
return root;
}
else if(leftTree != null) {
return leftTree;
}
else {
return rightTree;
}
}
}
9. 二叉树创建字符串
[OJ链接]:
代码示例:
class Solution {
public String tree2str(TreeNode root) {
StringBuilder stringBuilder = new StringBuilder();
tree2strChild(root,stringBuilder);
return stringBuilder.toString();
}
private void tree2strChild(TreeNode root, StringBuilder stringBuilder) {
if (root == null) {
return;
}
stringBuilder.append(root.val + "");
if (root.left != null) {
stringBuilder.append("(");
tree2strChild(root.left,stringBuilder);
stringBuilder.append(")");
}
else {
if (root.right == null) {
return;
}
else{
stringBuilder.append("()");
}
}
if (root.right != null) {
stringBuilder.append("(");
tree2strChild(root.right,stringBuilder);
stringBuilder.append(")");
}
else {
return;
}
}
}
10. 非递归方式实现前序遍历
[OJ链接]:
代码示例:
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()) {
while(cur != null) {
stack.push(cur);
list.add(cur.val);
cur = cur.left;
}
TreeNode top = stack.pop();
cur = top.right;
}
return list;
}
}
11. 非递归方式实现中序遍历
[OJ链接]:
代码示例:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur != null || !stack.empty()) {
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.pop();
list.add(top.val);
cur = top.right;
}
return list;
}
}
12. 非递归方式实现后序遍历
[OJ链接]:
代码示例:
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
TreeNode prev = null;
while(cur != null || !stack.isEmpty()) {
while(cur != null) {
stack.push(cur);
cur = cur.left;
}
TreeNode top = stack.peek();
if (top.right == null || top.right == prev) {
list.add(top.val);
stack.pop();
prev = top; // 记录下最新被打印的节点
}
else {
cur = top.right;
}
}
return list;
}
}