91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么實現二叉樹的堂兄弟節點查詢

發布時間:2023-04-27 17:49:58 來源:億速云 閱讀:116 作者:iii 欄目:開發技術

這篇文章主要介紹了C++怎么實現二叉樹的堂兄弟節點查詢的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++怎么實現二叉樹的堂兄弟節點查詢文章都會有所收獲,下面我們一起來看看吧。

    一.二叉樹的堂兄弟節點

    1.題目描述

    在二叉樹中,根節點位于深度 0 處,每個深度為 k 的節點的子節點位于深度 k+1 處。

    如果二叉樹的兩個節點深度相同,但 父節點不同 ,則它們是一對堂兄弟節點。

    我們給出了具有唯一值的二叉樹的根節點 root ,以及樹中兩個不同節點的值 xy

    只有與值 xy 對應的節點是堂兄弟節點時,才返回 true 。否則,返回 false

    力扣:力扣

    2.問題分析

    題目中很詳細的給出了判斷堂兄弟節點的條件:①兩個節點深度相同②父節點不同

    由此我們可以通過BFS和DFS找到題目給定的兩個值對應的二叉樹結點,記錄這兩個結點的深度和父節點,最后通過判斷堂兄弟結點的條件從而判斷是否為堂兄弟結點.

    3.代碼實現

    1.BFS解法
        // x 的信息
        int x;
        TreeNode xParent;
        int xDepth;
        boolean xFound = false;
        // y 的信息
        int y;
        TreeNode yParent;
        int yDepth;
        boolean yFound = false;
        public boolean isCousins(TreeNode root, int x, int y) {
            this.x = x;
            this.y = y;
            LinkedList<TreeNode> queue = new LinkedList<>();
            int depth = 0;
            if (root != null) {
                queue.offer(root);
                if (root.val == x || root.val == y) {
                    return false;
                }
            }
            while (!queue.isEmpty()) {
                int size = queue.size();
                for (int i = 0; i < size; ++i) {
                    TreeNode node = queue.poll();
                    if (node.left != null) {
                        queue.offer(node.left);
                        if (node.left.val == x) {
                            xParent = node;
                            xDepth = depth;
                        }
                        if (node.left.val == y) {
                            yParent = node;
                            yDepth = depth;
                        }
                    }
                    if (node.right != null) {
                        queue.offer(node.right);
                        if (node.right.val == x) {
                            xParent = node;
                            xDepth = depth;
                        }
                        if (node.right.val == y) {
                            yParent = node;
                            yDepth = depth;
                        }
                    }
                }
                depth++;
            }
            return xDepth == yDepth && xParent != yParent;
        }
    2.DFS解法
        // x 的信息
        int x;
        TreeNode xParent;
        int xDepth;
        boolean xFound = false;
        // y 的信息
        int y;
        TreeNode yParent;
        int yDepth;
        boolean yFound = false;
        public boolean isCousins(TreeNode root, int x, int y) {
            this.x = x;
            this.y = y;
            dfs(root, 0, null);
            return xDepth == yDepth && xParent != yParent;
        }
        public void dfs(TreeNode node, int depth, TreeNode parent) {
            if (node == null) {
                return;
            }
            if (node.val == x) {
                xParent = parent;
                xDepth = depth;
                xFound = true;
            } else if (node.val == y) {
                yParent = parent;
                yDepth = depth;
                yFound = true;
            }
            // 如果兩個節點都找到了,就可以提前退出遍歷
            // 即使不提前退出,對最壞情況下的時間復雜度也不會有影響
            if (xFound && yFound) {
                return;
            }
            dfs(node.left, depth + 1, node);
            if (xFound && yFound) {
                return;
            }
            dfs(node.right, depth + 1, node);
        }

    二.二叉樹的堂兄弟節點 II

    1.題目描述

    給你一棵二叉樹的根root,請你將每個節點的值替換成該節點的所有 堂兄弟節點值的和。

    如果兩個節點在樹中有相同的深度且它們的父節點不同,那么它們互為 堂兄弟。

    請你返回修改值之后,樹的根root

    注意,一個節點的深度指的是從樹根節點到這個節點經過的邊數。

    力扣:力扣

    2.問題分析

    每一次只需要求出下一層的所有節點的和,然后減去非子結點的值,就是其堂兄弟結點值的和了.

    3.代碼實現

        public TreeNode replaceValueInTree(TreeNode root) {
             root.val = 0;
            ArrayList<TreeNode> queue = new ArrayList<>();
            queue.add(root);
            while (!queue.isEmpty()) {
                ArrayList<TreeNode> tmp = queue;
                queue = new ArrayList<>();
                int nextLevelSum = 0; // 下一層的節點值之和
                for (TreeNode node : tmp) {
                    if (node.left != null) {
                        queue.add(node.left);
                        nextLevelSum += node.left.val;
                    }
                    if (node.right != null) {
                        queue.add(node.right);
                        nextLevelSum += node.right.val;
                    }
                }
                // 再次遍歷,更新下一層的節點值
                for (TreeNode node : tmp) {
                    int childrenSum = (node.left != null ? node.left.val : 0) +
                            (node.right != null ? node.right.val : 0);
                    if (node.left != null)
                        node.left.val = nextLevelSum - childrenSum;
                    if (node.right != null)
                        node.right.val = nextLevelSum - childrenSum;
                }
            }
            return root;
        }

    關于“C++怎么實現二叉樹的堂兄弟節點查詢”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++怎么實現二叉樹的堂兄弟節點查詢”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    c++
    AI

    平邑县| 施秉县| 洛宁县| 隆林| 盈江县| 乌恰县| 正宁县| 彩票| 文昌市| 武定县| 贺州市| 友谊县| 门头沟区| 山阳县| 滕州市| 三门县| 行唐县| 靖西县| 和平区| 张家界市| 浙江省| 拉萨市| 乐都县| 饶阳县| 桦甸市| 明溪县| 江都市| 海门市| 南京市| 辽中县| 密山市| 定襄县| 措勤县| 怀集县| 浙江省| 武山县| 虞城县| 交口县| 革吉县| 普陀区| 来宾市|