原创 二叉樹(三)二叉樹的高度、交換兩個子樹左右節點
比較簡單: int depth(Node *head) //空二叉樹的深度爲-1,只有根節點爲0,看連接線 這個函數求樹的深度 { if (head==NULL) { return -1; } return max(dept
原创 圖論(一)最小生成樹
最小生成樹有兩種算法:這裏先不寫代碼 1:普利姆算法(prim):初始狀態相當於兩個籃子A與B,籃子中裝的是點vertex,初始化時候A是空的,B是滿的 算法描述: 先從B中隨機找一個點放到A中,不斷從B中找距離A集合最近的一個點放到A中
原创 數據結構基礎(三)哈希表的實現
#pragma once #include <iostream> #define N 10 using namespace std; typedef struct node { int val; struct node *next;
原创 字符串處理基礎(一)反轉,循環移動
#pragma once using namespace std; void inverse(char *p); void printString(char *p); void rightMove(char *p,int n); void
原创 面試雜題(一)數組中最小的k個數
要找到數組中最小的k個數,只需要建立一個k大小的數組,或者在原數組中開闢一個大小爲k的區間,用來保留k個數; 遍歷原數組,如果有比k個數小的,就用該數去替換k數組中最大的,所以問題就轉化成在k數組中找最大的數,最差效率爲o((n-k)*k
原创 二叉樹(四)刪除二叉樹
如何刪除一個二叉樹,釋放每個節點的內存 可以把問題簡化成三個小問題 1)判斷一個節點是否是葉子節點 2)刪除一個二叉樹的所有葉子節點 3)不斷的刪除葉子節點,樹就被刪光了 void deleteBSTree(Node *&head) {
原创 面試雜題(四)有序數組中連續k的個數(更高效的方法) .
這是二分搜索的一個應用,找到FirstK以及LastK 代碼比較簡單 int NumofK(int *pData,int nLen,int k) { int nIndexLeft=GetFirstK(pData,nLen,k); if
原创 二叉樹(五)二叉樹中某一路徑之和爲某一整數
思路: 對於二叉樹中的某一節點, 如果是葉子節點,將其加入到path中,(一個vector)然後算vector中的和是否爲需要的整數,如果是就打印出來,如果和不滿足就退出函數,退出前pop vector; 如果不是葉子節點,直接將當前值加
原创 位操作(一)交換兩個數不用中間變量
先來說下異或 1^1=0 1 1 0 0^1=1 0 1 1 1^0=1 1 0 1 0^0=0 0 0 0 簡單的就是相異出一 相同出零 但是還有一個規律 比如第一行中的三個數 1 1
原创 面試雜題(七)二維數組中尋找
bool findNR(int **pArray,int nRowSize,int nColSize,int k) { int nRowIndex=0; int nColIndex=nColSize-1; while(nRowInd
原创 排序算法(六)快速排序
void quickSort(int *pData,int nLow,int nHigh) //遞歸,利用分割的結果,這就是一個不斷利用分割的過程 { if (nLow<nHigh) { int i=partition(pData
原创 數據結構基礎(二)隊列的實現
使用鏈表實現的隊列:typedef struct queueNode { int val; queueNode* next; }Node; class queue { public: queue() { front=NULL;
原创 排序算法(七)基數排序
從低位到高位排序,用hash來實現 #include <iostream> #define N 400 using namespace std; typedef struct Hdata { int data; struct Hda
原创 ACM(一)大數相乘
#include <iostream> using namespace std; void arrayPrint(int *p); void Muli(char *num1,char *num2); int main() { cha
原创 面試雜題(五)從尾到頭打印鏈表
#include <iostream> #include <stack> typedef struct node { int nData; struct node *next; }Node; Node * createLinklist