初級演算法 樹

2021-08-22 17:57:58 字數 3188 閱讀 3286

樹的大部分問題都可以通過遞迴解決,即求乙個樹的某個值可以轉化為求左子樹/右子樹的值

二叉樹最大深度就是max(左子樹的最大深度,右子樹的最大深度) + 1(根節點)

public

int maxdepth(treenode root)

intleft = maxdepth(root.left);

intright = maxdepth(root.right);

return left

< right ? right + 1: left+1;

}

二叉搜尋樹是自左向右的有序樹,可以通過中序遍歷,然後判斷中序遍歷的結果是否有序

public boolean isvalidbst(treenode root) 

listvalues = new arraylist();

inorder(root, values);

for (int i = 0; i < values.size() - 1; i++)

}return

true;

}// 中序遍歷

public

void

inorder(treenode root, listvalues)

inorder(root.left, values);

values.add(root.val);

inorder(root.right, values);

}

對稱二叉樹就是判斷左右子樹對稱,遞迴方法即可

public boolean issymmetric(treenode root) 

return isnodesymmetric(root.right, root.left);

}private boolean isnodesymmetric(treenode right, treenode left)

if (right == null || left == null)

boolean result = right.val == left.val && isnodesymmetric(right.right, left.left) &&

isnodesymmetric(right.left, left.right);

return result;

}

public

list

<

list

<

integer

>> levelorder(treenode root)

list

<

list

<

integer

>> result =

new arraylist<

list

<

integer

>>();

linkedlist

queue

=new linkedlist();

linkedlist nextqueue =

new linkedlist();

queue

.add(root);

list

<

integer

> level0 =

new arraylist<

integer

>();

level0.add(root.val);

result.add(level0);

if (root.left !=

null)

if (root.right !=

null)

while (!nextqueue.isempty())

if (node.right !=

null)

}if (!level.isempty())

}return result;

}

上面這個解法有問題,queue其實沒有用,還進行了佇列的深拷貝,空間複雜度高,並且花費的時間比較久,

if (root ==

null)

list

<

list

<

integer

>> result =

new arraylist<

list

<

integer

>>();

linkedlist

queue

=new linkedlist();

list

<

integer

> level0 =

new arraylist<

integer

>();

level0.add(root.val);

result.add(level0);

if (root.left !=

null)

if (root.right !=

null)

while (!

queue

.isempty())

if (node.right !=

null)

}if (!level.isempty())

}return result;

二叉搜尋樹本身就是有序的,所以將有序陣列轉換為二叉搜尋樹,就是按照左根右的順序構建樹,根節點就是中間的值,使用遞迴來解決

public treenode sortedarraytobst(int nums) 

return generatesortedarray(nums, 0, nums.length -1);

}private treenode generatesortedarray(int nums , int start, int

end)

intmid = (start + end)/2;

treenode head = new treenode(nums[mid]);

head.left = generatesortedarray(nums, start, mid -1);

head.right = generatesortedarray(nums, mid+1,end);

return head;

}

初級演算法之樹 層次遍歷

二叉樹的層次遍歷 給定乙個二叉樹,返回其按層次遍歷的節點值。即逐層地,從左到右訪問所有節點 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 157返回其層次遍歷結果 3 9 20 15,7 挺簡單一題。自己寫的 複雜一點,都貼上去吧 vectorint levelorde...

線段樹初級

今天做到一題是線段樹題,在此補充一下我自己缺失的知識點 首先介紹乙個寫的賊好的部落格 準備每天看一篇,每天增加乙個小的知識點。今天是線段樹 首先是建樹的過程,因為鄙人畫圖技術有限,所以大家還是參考那個部落格的講解吧,這裡主要是一些 void buildtree int l,int r,int n i...

初級演算法之樹 驗證二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 1 3輸出 true 示例 2 輸入 5 1 4 3 6輸出 false 解釋 輸入...