力扣LeetCode 1600.皇位继承顺序

题目链接:

力扣 1600.皇位继承顺序

不想戳的看下图:
力扣LeetCode 1600.皇位继承顺序

解题思路:

题目这种父子关系,最方便使用的就是二叉树了。但是我们没有办法保证每个人最多两个孩子,这就需要用到将多叉树转为二叉树的相关知识了。
我们可以定义一个树节点P的左子节点为P的孩子,而P的右子节点表示为P的兄弟。这样就可以完美地用二叉树来表示这个国家的父子兄弟关系。不难看出在这种情况下,继承顺序就是对该树中还存活的节点的前序遍历。

编程思路:

先定义树节点,注意添加一个状态表示该节点的生死状态。由于题目中保证了名称的不同,所以我们可以使用hashmap来快速的根据name找到对应的树节点。
对于birth函数,如果parentName对应的节点P还没有孩子,则直接将child插入P的左子节点,而对于后面的孩子,则只需要沿着P左子节点一直往右(兄弟方向)寻找到最后一个插入右子节点即可。

代码如下:

class ThroneInheritance {
    HashMap<String,TreeNode> map = new HashMap<>();
    TreeNode root;
    public ThroneInheritance(String kingName) {
        root = new TreeNode(kingName);
        map.put(kingName,root);
    }

    //先找到父亲节点,如果是第一个孩子,则插入左节点,如果是其他孩子则插入左节点的最右节点
    public void birth(String parentName, String childName) {
        TreeNode parent = map.get(parentName);
        TreeNode child = new TreeNode(childName);
        map.put(childName,child);
        if(parent.left == null){
            parent.left = child;
        }else{
            TreeNode cur = parent.left;
            while(cur.right != null){
                cur = cur.right;
            }
            cur.right = child;
        }
    }

    //找到该节点,标记为死亡
    public void death(String name) {
        TreeNode people = map.get(name);
        people.state = 1;
    }

    //前序遍历
    public List<String> getInheritanceOrder() {
        List<String> order = new ArrayList<>();
        visit(root,order);
        return order;
    }

    //辅助的继承顺序遍历函数,实际上就是一个前序遍历
    private void visit(TreeNode t,List<String> order){
        if(t != null){
            if (t.state == 0){
                order.add(t.name);
            }
            visit(t.left,order);
            visit(t.right,order);
        }
    }
}

//定义树节点
class TreeNode{
    String name;
    int state;
    TreeNode left;
    TreeNode right;
    public TreeNode(String name){
        this.name = name;
        state = 0;
    }
}

/**
 * Your ThroneInheritance object will be instantiated and called as such:
 * ThroneInheritance obj = new ThroneInheritance(kingName);
 * obj.birth(parentName,childName);
 * obj.death(name);
 * List<String> param_3 = obj.getInheritanceOrder();
 */

小结

力扣还是一个比较好的刷题网站,建议多在这里刷题,能力会有质的飞跃!

上一篇:oracle中 SCN号总结 上篇


下一篇:我的十年青春:写博10年1600万PV、创业5年30万学员