遞迴 之 二叉樹

2021-07-23 15:37:10 字數 1095 閱讀 1766

如上圖所示,由正整數1, 2, 3, ...組成了一棵無限大的二叉樹。從某乙個結點到根結點(編號是1的結點)都有一條唯一的路徑,比如從10到根結點的路徑是(10, 5, 2, 1),從4到根結點的路徑是(4, 2, 1),從根結點1到根結點的路徑上只包含乙個結點1,因此路徑就是(1)。對於兩個結點x和y,假設他們到根結點的路徑分別是(x1, x2, ... ,1)和(y1, y2, ... ,1)(這裡顯然有x = x1,y = y1),那麼必然存在兩個正整數i和j,使得從xi 和 yj開始,有xi = yj ,xi + 1 = yj + 1,xi + 2 = yj + 2,... 現在的問題就是,給定x和y,要求xi(也就是yj)。

輸入資料

輸入只有一行,包括兩個正整數x和y,這兩個正整數都不大於1000。

輸出要求

輸出只有乙個正整數xi。

輸入樣例

10 4

輸出樣例

2這個題目要求樹上任意兩個節點的最近公共子節點。分析這棵樹的結構不難看出,不論奇數偶數,每個數對2做整數除法,就走到它的上層結點。

我們可以每次讓較大的乙個數(也就是在樹上位於較低層次的節點)向上走乙個結點,直到兩個結點相遇。如果兩個節點位於同一層,並且它們不相等,可以讓其中任何乙個先往上走,然後另乙個再往上走,直到它們相遇。設common(x, y)表示整數x和y的最近公共子節點,那麼,根據比較x和y的值,我們得到三種情況:1) x與y相等,則common(x, y)等於x並且等於y;2)x大於y,則common(x, y)等於common(x/2, y);3)x大於y,則common(x, y)等於common(x y/2);

#include int common(int x, int y)

void main()

問題一:有一種比較直觀的解法是對於兩個給定的數,分別求出它們到根節點的通路上的所有節點的值,然後再在兩個陣列中尋找數碼最大的公共節點。這種做法的**比較繁瑣,容易在實現中出錯;

問題二:**實現邏輯不明晰,造成死迴圈等錯誤,例如,有人只將其中乙個數不停地除以2,而不理會另外乙個數。

二叉樹之 二叉樹深度

二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...

樹之二叉樹

二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。滿二叉樹 在二叉樹的第i 層上有2 i 1 個結點,深度為k的二叉樹有2 k 1個結點的二叉樹。則此二叉樹稱為 滿二叉...

二叉樹(二)之二叉查詢樹

目錄 一 二叉查詢樹的概念 二 二叉查詢樹的實現 三 二叉查詢樹 binary search tree 又被稱為二叉搜尋樹。它是特殊的二叉樹 對於二叉樹,假設x為二叉樹中的任意乙個結點,x節點包含關鍵字key,節點x的key值記為key x 如果y是x的左子樹中的乙個結點,則key y key x ...