leetcode刷題筆記(二)

2021-10-07 09:38:29 字數 3929 閱讀 7381

接上篇,先來看106題,此題與105題類似,是通過中序和後序遍歷結果復原二叉樹。

還是選擇遞迴的方法:

首先看題目函式的引數:

struct treenode* buildtree(int* inorder, int inordersize, int* postorder, int postordersize)

中序的首結點和結點數,後序的首結點和結點數。

那麼第一步就是判空,通過結點數進行判斷。

其次,根結點的位置是後序遍歷的最後乙個,先對根結點進行賦值,然後找到根結點在中序遍歷中的位置。

對於根結點在中序遍歷中的位置座標i(第i+1個,root=inorder[i]),其左邊為左子樹,共i個元素,右邊為右子樹,共size-i-1,對於後序遍歷,前i個元素為左子樹,第i+1個元素到倒數第二個元素為右子樹,進行遞迴。

c語言**如下:

/**

* definition for a binary tree node.

* struct treenode ;

*/struct treenode*

buildtree

(int

* inorder,

int inordersize,

int* postorder,

int postordersize)

p->left =

buildtree

(inorder, i, postorder, i)

; p->right =

buildtree

(inorder + i +

1, inordersize - i -

1, postorder + i, postordersize - i -1)

;return p;

}

第104題,簡單難度,求二叉樹最大深度。

顯然,是返回左子樹和右子樹的深度中較大的乙個。可以寫成return left_depth>right_depth?left_depth:right_depth;

第一步仍然是判空,空樹返回0即可。

第二步分別初始化左右子樹高度為1。

第三步遞迴呼叫函式求解左右子樹高度。

c語言**如下:

/**

* definition for a binary tree node.

* struct treenode ;

*/int

maxdepth

(struct treenode* root)

同時,這種思路其實也是深度優先的思想。

另一種方法是廣度優先的思想,通過佇列輔助實現:

1,構建佇列,實現入隊和出隊函式

2,利用佇列先進先出的特性實現二叉樹的層序遍歷

3,將二叉樹根 root 壓入佇列,並將 null 作為每層的區分節點也壓入佇列

4,遇到層的區分節點則處理下一層,直到隊列為空

//佇列結點結構

typedef

struct queuenode queuenode_t;

//佇列結構

typedef

struct linkqueue linkqueue_t;

//佇列初始化

intinitqueue

(linkqueue_t *queue)

//入隊函式

intenqueue

(linkqueue_t *queue,

struct treenode *data)

//出隊函式

intdequeue

(linkqueue_t *queue,

struct treenode *data)

queuenode_t *denode = queue->front->next;

//指向待出隊元素

*data = denode->data;

queue->front->next = denode->next;

//尾指標與後乙個元素相連

if(denode == queue->rear)

free

(denode)

; queue->count--

;return0;

}//佇列銷毀

void

destroyqueue

(linkqueue_t *queue)

}//佇列判空

intemptyqueue

(linkqueue_t *queue)

intmaxdepth

(struct treenode *root)

if(data->right)

} max++;}

destroyqueue

(&queue)

;return max;

}

和此題相對應的是第111題,求二叉樹的最小深度,也要略複雜一點兒。

首先,這次不能單純的比較左右子樹小的一方,需要分情況討論:

第一種情況,空樹直接返回0;

第二種情況,只有根結點,返回1;

第三種情況,有左節點無右節點,遞迴左子樹;

第四種情況,有右節點無左節點,遞迴右子樹;

第五種情況,兩側均有,分別遞迴左右子樹,返回最小值+1;

/**

* definition for a binary tree node.

* struct treenode ;

*/int

mindepth

(struct treenode* root)

}

bfs:

如果出現葉子節點,就返回當前深度。

//方法二:bfs

typedef

struct queuenode queuenode_t;

typedef

struct linkqueue linkqueue_t;

intinitqueue

(linkqueue_t *queue)

intenqueue

(linkqueue_t *queue,

struct treenode *data)

newnode->data = data;

newnode->next =

null

; queue->rear->next = newnode;

queue->rear = newnode;

queue->count++

;return0;

}int

dequeue

(linkqueue_t *queue,

struct treenode *

*data)

queuenode_t *denode = queue->front->next;

*data = denode->data;

queue->front->next = denode->next;

if(denode == queue->rear)

free

(denode)

; queue->count--

;return0;

}void

destroyqueue

(linkqueue_t *queue)

}int

emptyqueue

(linkqueue_t *queue)

intmindepth

(struct treenode *root)

if(data->left)

if(data->right)}}

destroyqueue

(&queue)

;return max;

}

LeetCode刷題筆記(二)

4.兩個排序陣列的中位數 給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不同時為空。示例 1 nums1 1,3 nums2 2 中位數是 2.0示例 2 nums1 1,2 ...

leetcode刷題筆記(二)

描述 給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 pwwkew 輸出...

Leetcode刷題筆記

1.兩數之和給定乙個整數陣列nums 和乙個目標值target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。ps 你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素。思路 用target減去nums中的每乙個數,並設立乙個字典來記錄對應的下標 class...