由對稱二叉樹定義: 對於樹中 任意兩個對稱節點 l 和 r ,一定有:
l->val = r->val:即此兩對稱節點值相等。
l->left->val = r->right->val:即 l 的 左子節點 和 r 的 右子節點 對稱;
l->right->val = r->left->val:即 l 的 右子節點 和 r 的 左子節點 對稱。
根據以上規律,考慮從頂至底遞迴,判斷每對節點是否對稱,從而判斷樹是否為對稱二叉樹
class solution
bool recur(treenode* l, treenode* r)
};
(1) 遞迴
class solution
};
(2) 利用層序遍歷,每過一層depth+1;
class solution
depth ++;
}return depth;
}};
二叉搜尋樹的中序遍歷是公升序序列,題目給定的陣列是按照公升序排序的有序陣列,因此可以確保陣列是二叉搜尋樹的中序遍歷序列。
我們可以選擇中間數字作為二叉搜尋樹的根節點,這樣分給左右子樹的數字個數相同或只相差 1,可以使得樹保持平衡。
確定平衡二叉搜尋樹的根節點之後,其餘的數字分別位於平衡二叉搜尋樹的左子樹和右子樹中,左子樹和右子樹分別也是平衡二叉搜尋樹,因此可以通過遞迴的方式建立平衡二叉搜尋樹。
關於中間數字:int mid = (left + right) / 2;(中間/中間左邊) int mid = (left + right+1) / 2 (中間右邊)
class solution
treenode* buildbst(vector& nums, int left, int right)
};
(1)將鍊錶轉化為陣列,然後如上題遞迴。
(2) 中序遍歷模擬
我們知道中序遍歷最左邊的元素一定是給定鍊錶的頭部,類似地下乙個元素一定是鍊錶的下乙個元素,以此類推。這是肯定的因為給定的初始鍊錶保證了公升序排列。遍歷整個鍊錶獲得它的長度,我們用兩個指標標記結果陣列的開始和結束,記為 start 和 end,他們的初始值分別為 0 和 length - 1。
記住,我們當前需要模擬中序遍歷,找到中間元素 (start + end) / 2。注意這裡並不需要在鍊錶中找到確定的元素是哪個,只需要用乙個變數告訴我們中間元素的下標。我們只需要遞迴呼叫這兩側。
遞迴左半邊,其中開始和結束的值分別為 start, mid - 1。
在這個演算法中,每當我們構建完二叉搜尋樹的左半部分時,鍊錶中的頭指標將指向根節點或中間節點(它成為根節點)。 因此,我們只需使用頭指標指向的當前值作為根節點,並將指標後移一位,即 head = head->next。
我們再遞迴右半部分 mid + 1, end。
class solution
return listtobst(head,0,_size-1);
}treenode* listtobst(listnode* &head,int start, int end)
};
利用二叉搜尋樹中序遍歷的有序性
class solution
void _kthsmallest(treenode* root, int k)
n++;
if(n==k) ans=root->val;
if(root->right!=nullptr)
}};
leetcode200題之二叉樹專題(四)
建立方法construct nums,l,r 用於找出在陣列 numsnums 中從 ll 到 rr 索引 不包含第 rr 個位置 中最大二叉樹的根節點。演算法步驟如下 首先呼叫 construct nums,0,n 其中 n 是陣列 numsnums 的長度。在索引範圍 l r 1 內找到最大值的...
leetcode200題之二叉樹專題(一)
一條路徑的長度為該路徑經過的節點數減一,所以求直徑 即求路徑長度的最大值 等效於求路徑經過節點數的最大值減一。而任意一條路徑均可以被看作由某個節點為起點,從其左兒子和右兒子向下遍歷的路徑拼接得到。我們定義乙個遞迴函式 depth node 計算d node,函式返回該節點為根的子樹的深度。先遞迴呼叫...
演算法題 leetcode200 島嶼數量
題目描述 給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。深度搜尋class solution return count public static void combine ...