首页 > 其他分享 >二叉树面试题进阶

二叉树面试题进阶

时间:2024-01-21 13:12:22浏览次数:38  
标签:面试题 right return 进阶 二叉树 TreeNode null root left

二叉树面试题进阶

1. 二维数组存储层序遍历结果

难点:  如何存储每一层的节点 ?根据队列节点的个数判断每一层

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> retList = new ArrayList<>();
        if (root == null) {
            return retList; 
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int sz = queue.size();
            List<Integer> array = new ArrayList<>();
            while (sz != 0) {
                TreeNode cur = queue.poll();
                array.add(cur.val);
                sz--;
                if (cur.left != null) {
                    queue.offer(cur.left);
                }
                if (cur.right != null) {
                    queue.offer(cur.right);
                }
            }
            retList.add(array);
        }
        return retList;
    }
}

2. 找两个节点的最近公共祖先

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) {
            return null;
        }
        if (root == q || root == p) {
            return root;
        }
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        if (left != null && right != null) {
            return root;
        }else if (left != null){
            return left;
        }else {
            return right;
        }
    }
}

这题还有一个更妙的解法 类似解找两个链表相交的节点

 

这种解法的难点在于如何 使用栈结构保存 r -> p,q 路径上所有节点

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    // 获得指定节点路径上所有节点
   public boolean getPathNode(Stack<TreeNode> stack, TreeNode root, TreeNode node) {
        if (root == null) {
            return false;
        }
        stack.push(root);
        if (stack.peek() == node) {
            return true;
        }
        if (getPathNode(stack,root.left,node)) {
            return true;
        }
        if (getPathNode(stack,root.right,node)) {
            return true;
        }
        stack.pop();
        return false;
    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        Stack<TreeNode> stackA = new Stack<>();
        Stack<TreeNode> stackB = new Stack<>();
        getPathNode(stackA,root,p);
        getPathNode(stackB,root,q);

        if (stackA.size() > stackB.size()) {
            int sz = stackA.size() - stackB.size();
            while (sz != 0) {
                stackA.pop();
                sz--;
            }
        }else {
            int sz = stackB.size() - stackA.size();
            while (sz != 0) {
                stackB.pop();
                sz--;
            }
        }

        while (!stackA.isEmpty() && !stackB.isEmpty()) {
            if (stackA.peek() == stackB.peek()) {
                return stackA.peek();
            }else {
                stackA.pop();
                stackB.pop();
            }
        }
        return null;
    }
}

3. 二叉树创建字符串

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public String tree2str(TreeNode root) {
        StringBuilder sbu = new StringBuilder();
        tree2strChild(root,sbu);
        return sbu.toString();
    }
    public void tree2strChild(TreeNode root,StringBuilder sbu) {
        if (root == null) {
            return;
        }
        sbu.append(root.val);

        if (root.left != null) {
            sbu.append("(");
            tree2strChild(root.left,sbu);
            sbu.append(")");
        }else {
            if (root.right == null) {
                return;
            }else {
                sbu.append("()");
            }
        }

        if (root.right != null) {
            sbu.append("(");
            tree2strChild(root.right,sbu);
            sbu.append(")");
        }else {
            return;
        }
    }
}

 

标签:面试题,right,return,进阶,二叉树,TreeNode,null,root,left
From: https://www.cnblogs.com/xumu7/p/17975457

相关文章

  • 45个经典Linux面试题!赶紧收藏!
    问题一:绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?答案:绝对路径:如/etc/init.d当前目录和上层目录:./../主目录:~/切换目录:cd问题二:怎么查看当前进程?怎么执行退出?怎么查看当前路径?答案:查看当前进程:ps执行退出:exit查看当前路径:pwd问题三......
  • 实现创建二叉树
    创建二叉树1.前序遍历创建二叉树importjava.util.Scanner;//注意类名必须为Main,不要有任何packagexxx信息classTreeNode{publicTreeNodeleft;publiccharval;publicTreeNoderight;publicTreeNode(charval){this.val=......
  • 最少交换次数 置换环 LeetCode 2471. 逐层排序二叉树所需的最少操作数目
    voidMain(){ varroot=newTreeNode(1) { left=newTreeNode(3) { left=newTreeNode(7), right=newTreeNode(6) }, right=newTreeNode(2) { left=newTreeNode(5), right=newTreeNode(4) } }; varr=newSolution().Minimu......
  • 遍历二叉树
    二叉树前言二叉树的遍历主要有深度优先遍历和广度优先遍历,深度优先遍历是优先访问一个子树上的所有节点,访问的属性是竖向的,而广度优先遍历则是优先访问同一层的所有节点,访问属性是横向的。深度优先遍历深度优先遍历主要有三种顺序:前序遍历——根左右中序遍历——左根......
  • C++常见面试题整理
    1.CPP编译链接过程1.CPP编译链接过程预处理处理以#开头的命令,纯文本替换,类型不安全#pragmalib和#pragmalink除外,#pragmalib用于指定要链接的库,#pragmalink用于指定程序入口(默认入口是main函数,但可以通过该命令修改)都是在链接阶段进行处理编译词法分析,语法分析,......
  • SQL常见面试题(测试工程师)
    用一条 SQL 语句 查询出每门课都大于 60 分的学生姓名。表 scores 如下SELECTname,MIN(score)ashigtfromstudent_scoressgroupbynameHAVINGhigt>60用一条 SQL 语句 查询两门以上不及格课程的同学的学号姓名以及其平均成绩, 并按成绩排序SELECT......
  • 代码之外:工程师的成长进阶秘籍
    程序员只懂技术能行吗? 为什么说技术人员“说”和“写”总得擅长一个? 你以为的“关注结果”是真的结果吗? 从一线工程师跃升团队管理者一共分几步? 在不断变化的职场环境中,技术人如何保持竞争力并实现自我增值,是摆在每个人面前的挑战。无论是一线工程师还是技术管理者,如......
  • TS进阶1
    //1、函数重载functionhello(name:string):stringfunctionhello(age:number):stringfunctionhello(value:string|number):string{if(typeofvalue==='string'){return'你好,我的名字是'+value}elseif(typeofvalue==='......
  • 二叉树 - 二叉树入门题
    二叉树入门题1.判断两颗树是否相同classSolution{publicbooleanisSameTree(TreeNodep,TreeNodeq){//如何判断两颗树是否相同?根相同+左右子树相同//如何判断根相同?结构+值相同if(p==null&&q!=null||p!=null&&......
  • 鸿蒙生态游戏揭开进阶新篇章,25家游戏伙伴参加合作仪式
    1月18日,鸿蒙千帆启航仪式在深圳召开,华为宣布HarmonyOSNEXT鸿蒙星河版开发者预览面向开发者开放申请,并公布鸿蒙生态最新进展:鸿蒙生态设备数量仅历时5个月即从7亿增长至8亿,千行百业实现万物互联,将打开万亿级产业新蓝海。游卡网络、紫龙游戏、雷霆游戏、巨人网络、中旭未来、游酷盛......