接上篇,先來看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...