二、堆
三、對應的 leetcode 練習題
1.1 實現乙個二叉查詢樹,並且支援插入、刪除、查詢操作
二叉查詢數:二叉查詢樹(binary search tree),又被稱為二叉搜尋樹。
它是特殊的二叉樹:對於二叉樹,假設x為二叉樹中的任意乙個結點,x節點包含關鍵字key,節點x的key值記為key[x]。如果y是x的左子樹中的乙個結點,則key[y] <= key[x];如果y是x的右子樹的乙個結點,則key[y] >= key[x]。那麼,這棵樹就是二叉查詢樹。
//節點定義
typedef struct bstreenodenode,*bstree;
//插入
bstree* inserttree(bstree *t,int data)
if(t->data>data)
else if(t->data < data)
else
}//刪除
bstree* deletetree(bstree *t,int data)
if(t->data>data)
else if(t->dataright=deletetree(t->right,data);
}else if(t->left != null && t->right != null)
else
return t;
}//查詢
bstree* search(bstree *t,int data)
else if(t->data>data)
else if(t->dataright,data);
}else
}
1.2 實現查詢二叉查詢樹中某個節點的後繼、前驅節點//節點的前驅是該節點的左子樹的最大節點
//節點的後繼是該節點的右子樹中的最小節點
node* bstree_predecessor(node *x)
return y;
}node* bstree_successor(node *x)
return y;
}
1.3 實現二叉樹前、中、後序以及按層遍歷//前序遍歷 遞迴實現
void preorder(bstree tree)
}//中序遍歷
void inorder(bstree tree)
}//後序遍歷
void postorder(bstree tree)
}
2.1 小頂堆、大頂堆、優先順序佇列堆:堆實際上是一棵完全二叉樹,任何一非葉節點的關鍵字不大於或者不小於其左右孩子節點的關鍵字。分為大頂堆和小頂堆。
大頂堆:所有節點的子節點比其自身小的堆。key[i]>=key[2i+1]&&key>=key[2i+2]
小頂堆:所有節點的子節點比其自身大的堆。key[i]<=key[2i+1]&&key[i]<=key[2i+2]
優先順序佇列:優先順序佇列是帶有優先順序的佇列,普通的佇列是從隊尾進資料,從隊頭出資料,而優先順序隊列入資料一樣,不過出資料的時候是根據資料的優先順序從高到低進行出資料,這種資料型別適用於一些檔案管理的軟體,優先順序佇列的使用也會加快工作效率,相比於一般佇列,優先順序佇列也不會出現假溢位的問題。
// 初始化大頂堆
void initheapmax(int a, int len) }
//調整大頂堆
void adjustmaxheap(int a, int len, int parentnodeindex)
// 記錄比父節點大的左孩子或者右孩子的索引
int targetindex = -1;
// 獲取左、右孩子的索引
int leftchildindex = 2 * parentnodeindex + 1;
int rightchildindex = 2 * parentnodeindex + 2;
// 沒有左孩子
if (leftchildindex >= len)
// 有左孩子,但是沒有右孩子
if (rightchildindex >= len)
// 有左孩子和右孩子
else
// 只有孩子比父節點的值還要大,才需要交換
if (a[targetindex] > a[parentnodeindex])
}
//小頂堆初始化
void initheapmin(int a, int len) }
void adjustminheap(int a, int len, int parentnodeindex)
// 記錄比父節點大的左孩子或者右孩子的索引
int targetindex = -1;
// 獲取左、右孩子的索引
int leftchildindex = 2 * parentnodeindex + 1;
int rightchildindex = 2 * parentnodeindex + 2;
// 沒有左孩子
if (leftchildindex >= len)
// 有左孩子,但是沒有右孩子
if (rightchildindex >= len)
// 有左孩子和右孩子
else
// 只有孩子比父節點的值還要小,才需要交換
if (a[targetindex] < a[parentnodeindex])
}
2.2 實現堆排序//用大頂堆實現
void heapsort(int a, int len)
// 初始堆成無序最大堆
initheapmax(a, len);
for (int i = len - 1; i > 0; --i)
adjustmaxheap(a, i - 1, 0);
}}
3.1 invert binary tree(翻轉二叉樹)
leetcode 226
//遞迴 交換根節點的左右子樹,對左右子樹分別執行遞迴反轉
/** * definition for a binary tree node.
* struct treenode
* };
*/class solution
};
3.2 maximum depth of binary tree(二叉樹的最大深度)
leetcode 104
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
else
return 0;
}};
3.3 validate binary search tree(驗證二叉查詢樹)
leetcode 98
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
bool isvalidbst(treenode *root,long min,long max)
};
3.4 path sum(路徑總和)
leetcode 112
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
};
the end~ 資料結構 二叉堆
二叉堆一般用來實現優先佇列 優先佇列是一種至少允許以下兩種操作的資料結構 insert 以及 deletemin 同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。一 結構性 二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構...
資料結構 二叉堆
二叉堆 優先佇列 具有結構性和堆序性 結構性為 二叉堆是一棵完全被填滿的二叉樹,有可能的例外是在底層,底層上的元素從左到右填入。這樣的樹稱為完全二叉樹。二叉堆可以用陣列表示,對於陣列中任意位置i上的元素,其左兒子在位置2i上,右兒子在位置2i 1上,父親則在i 2上 小於i 2的最小整數 堆序性為 ...
資料結構 二叉堆
二叉堆其實就是二叉樹,只不過二叉堆的最頂端的值,要麼最大,要麼最小,這要根據題意來定。如圖 讀者注意一下,圖上的黑字代表二叉堆的值,而紅色則代表下表。二叉堆的基本操作 插入,刪除和查詢。堆的stl實現 本人不太懂,就參考這位大佬的 上圖中,q.top 就是查詢,q.pop 就是刪除,q.push 就...