總結演算法中常見的二叉樹問題

2022-08-15 19:33:12 字數 4051 閱讀 6798

1.遍歷二叉樹

說到二叉樹,最開始就要提到二叉樹的遍歷了。遍歷分為遞迴版和非遞迴版,這裡先說一下遞迴版。

但其實遞迴版也沒什麼好說的,就是把我們列印節點或者收集節點的時間放在了不同地方就能實現了。

這裡說到非遞迴版,這裡我想說的是,當用到先序遍歷或者中序遍歷後序遍歷,都是用到棧輔助,這樣子我們就能到乙個節點兩次,實現遍歷。當我們想要按層遍歷的時候,是用到佇列來輔助的。遍歷的時候,先壓左,再壓右,當佇列不為空的時候,繼續彈出頭部,彈出的時候如果有左孩子就壓入左孩子,如果有右孩子,就壓入右孩子。

記住乙個規律,普通遍歷用棧,按層遍歷用佇列。

實現二叉樹的序列化和反序列化

public

static

class

node

}public

static

string serialbypre(node head)

string res = head.value + "!";

res +=serialbypre(head.left);

res +=serialbypre(head.right);

return

res;

}//反序列化

public

static

node reconbyprestring(string prestr)

return

reconpreorder(queue);

}//給我乙個佇列,我返回二叉樹

public

static node reconpreorder(queuequeue)

node head = new

node(integer.valueof(value));

head.left =reconpreorder(queue);

head.right =reconpreorder(queue);

return

head;

}

使用佇列實現按層遍歷也有兩個題目,乙個是判斷一棵二叉樹是否完全二叉樹,計算一棵完全二叉樹的大小。

判斷一棵樹是否為完全二叉樹(按層遍歷)

1)如果有右無左,則直接返回false

2)如果左右不全,則接下來遇到的所有節點都為葉子節點

2.morris演算法

morris演算法就是把遞迴過程省略了,也把輔助結構棧也給省略了,把二叉樹中的空指標給利用起來,實現更快的遍歷。

1)記錄當前結點為cur。

如果cur無左孩子,cur向右移動(cur =cur.right);

2)如果cur有左孩子,找到cur左子樹上最右的節點,記為mostright.

①如果mostright的right指標指向空,讓其指向cur,cur向左移動;

②如果mostright的right指標不指向空,cur先向右移動,再讓mostright的right指向null.

從圖可以看出,其實就是cur指標在不斷地向左跳,然後沿途建立那條很長的指標

接下來就是,當cur指標的左子樹為空時,此時向右跳,也就是 cur = cur.right。而因為我們剛剛沿途建立的指標,我們在向右跳的時候,其實也是在往上跳。

往右跳的過程就是順著我們建立的「長指標」往上跳,再沿途把「長指標」恢復原樣。

//如果最右節點的右指標為空,則讓它指向cur.然後cur向左移動

if (cur2.right == null

) else

} else

cur1 =cur1.right;

}system.out.println();

}

morris演算法的先序中序遍歷也是不同到達節點時機。但是後序的話不一樣,因為morris演算法沒有到達乙個節點三次,所以我們只針對有左孩子的節點,當到達乙個節點第二次的時候,逆序遍歷該節點的左孩子的右邊界。

逆序列印比較麻煩,就需要我們去改鍊錶的方向,遍歷後再改回來

3.找最低公共祖先

4.找到最大的搜尋二叉子樹

首先我們最大搜尋二叉樹有三種可能(列可能性)

①包括自己節點為最大搜尋二叉樹;

②節點的左子樹為最大搜尋二叉樹;

③節點的右子樹為最大搜尋二叉樹。

所以我們要分析要返回的是什麼型別,我們的返回值應該為(size,最大搜尋二叉樹的頭結點,搜尋二叉樹的最大值,搜尋二叉樹的最小值)

public

static

class

node

}public

static

intgetbiggestsubbstsize(node head)

public

static

class

returntype

}public

static

returntype process(node head)

returntype leftreturntype =process(head.left);

returntype rightreturntype =process(head.right);

int p1 =leftreturntype.size;

int p2 =rightreturntype.size;

int includehead = 0;

if (leftreturntype.head == head.left &&rightreturntype.head == head.right &&leftreturntype.max

< head.value &&rightreturntype.min >head.value)

int maxsize =math.max(math.max(p1, p2),includehead);

node bsthead = p1 > p2 ?leftreturntype.head : rightreturntype.head;

if (maxsize ==includehead)

return

newreturntype(maxsize,

bsthead,

math.min(math.min(leftreturntype.min,rightreturntype.min),head.value),

math.max(math.max(leftreturntype.max,rightreturntype.max),head.value));

}

二叉樹的常見演算法1

struct treenode 給你一串字串,每個節點用 隔開,用 代表空的字串。按從上到下的順序給出字串。例如 字串 1,2,3,4對應的二叉樹為 根據 的位置分離出每乙個節點,儲存在vector陣列中。建立每乙個節點的指標關係。index記錄的是i的子樹的位置 while index path....

樹,二叉樹及演算法總結

滿二叉樹在同樣深度的二叉樹中葉子結點個數最多 1.葉子結點只能出現在最下兩層,且最下層的葉子結點都集中在二叉樹的左部 2.完全二叉樹中如果有度為1的結點,只可能有乙個,且該結點只有左孩子。3.深度為k的完全二叉樹在k 1層上一定是滿二叉樹。1 有n個節點的完全二叉樹的深度為 k l og2n k l...

樹 二叉樹 查詢演算法總結

一 樹 樹的基本操作 二 二叉樹 最優二叉樹 哈夫曼樹 在所有含 n 個葉子結點 並帶相同權值的 m 叉樹中,必存在一棵其帶權路徑長度取最小值的樹,稱為 最優樹 赫夫曼演算法 以二叉樹為例 根據給定的 n 個權值 構造 n 棵二叉樹的集合f 其中每棵二叉樹中均只含乙個帶權值為 wi 的根結點,其左 ...