BiTree.h
#ifndef BITREE_H_H #define OK 1 #define ERROR 0 typedef char ElemType; typedef struct BiLNode { ElemType data; struct BiLNode *lchild; struct BiLNode *rchild; }BiTree; int init_BiTree(BiTree*); int make_node(BiLNode**); int create_BiTree(BiTree**); int preOrderTraverse_BiTree(BiTree*); int inOrderTraverse_BiTree(BiTree*); int postOrderTraverse_BiTree(BiTree*); int levelOrderTraverse_BiTree(BiTree*); int destroy_BiTree(BiTree**); int empty_BiTree(BiTree*); int depth_BiTree(BiTree*); int getValue_BiTree(BiTree*, ElemType*); int assign_BiTree(BiTree*, ElemType); int parent_BiTree(BiTree*, BiLNode**, BiLNode*); int leftChild_BiTree(BiTree*, BiLNode**, BiLNode*); int rightChild_BiTree(BiTree*, BiLNode**, BiLNode*); int leftSibling_BiTree(BiTree*, BiLNode**, BiLNode*); int rightSibling_BiTree(BiTree*, BiLNode**, BiLNode*); int insertChild_BiTree(BiTree*, BiTree*, BiLNode*, int); int deleteChild_BiTree(BiTree*, BiLNode*, int); #endif
BiTree.cpp
#include<stdio.h> #include<stdlib.h> #include"BiTree.h" int init_BiTree(BiTree *btree) { btree = NULL; return OK; } //後續遍歷銷燬二叉表 int destroy_BiTree(BiTree **btree) { if((*btree) == NULL) return ERROR; else { destroy_BiTree(&(*btree)->lchild); destroy_BiTree(&(*btree)->rchild); free(*btree); (*btree) = NULL; } return OK; } int make_node(BiLNode **node) { if(!((*node) = (BiLNode*)malloc(sizeof(BiLNode)))) return ERROR; return OK; } int create_BiTree(BiTree **btree) { char ch; scanf("%c",&ch); if(ch == '#') { (*btree) = NULL; } else { if(!make_node(btree)) return ERROR; (*btree)->data = ch; create_BiTree(&(*btree)->lchild); create_BiTree(&(*btree)->rchild); } return OK; } int empty_BiTree(BiTree *btree) { if(btree == NULL) return true; return false; } //求二叉樹深度 int depth_BiTree(BiTree *btree) { int dep = 0; int dep1 = 0; if(btree == NULL) return 0; else { dep = depth_BiTree(btree->lchild) ; dep1 = depth_BiTree(btree->rchild); return dep > dep1 ? dep + 1 : dep1 + 1; } return OK; } int getValue_BiTree(BiTree *btree, ElemType *e) { if(btree == NULL) return ERROR; *e = btree->data; return OK; } int assign_BiTree(BiTree *btree, ElemType e) { if(btree == NULL) return ERROR; btree->data = e; return OK; } //返回e結點的雙親 int parent_BiTree(BiTree *btree, BiLNode **parent, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp ->lchild == e || tmp->rchild == e) { (*parent) = tmp; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回e結點的左孩子 int leftChild_BiTree(BiTree *btree, BiLNode **lchild, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { (*lchild) = tmp->lchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回e結點的右孩子 int rightChild_BiTree(BiTree *btree, BiLNode **rchild, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { (*rchild) = tmp->rchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回結點左兄弟 int leftSibling_BiTree(BiTree *btree, BiLNode **lsib, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp ->lchild == e || tmp->rchild == e) { if(tmp->lchild == e) (*lsib) = NULL; else (*lsib) = tmp->lchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //返回結點右兄弟 int rightSibling_BiTree(BiTree *btree, BiLNode **rsib, BiLNode *e) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp ->lchild == e || tmp->rchild == e) { if(tmp->rchild == e) (*rsib) = NULL; else (*rsib) = tmp->rchild; break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //在e的位置插入c到二叉樹 //條件: c的右子樹必爲空,flag是在左還是右插入,0 左 1 右 int insertChild_BiTree(BiTree *btree, BiTree *c, BiLNode *e, int flag) { if(c->rchild != NULL) return ERROR; BiLNode *queue[30], *tmp, *tmp1; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { //在左邊插入樹 if(flag == 0) { tmp1 = tmp->lchild; tmp->lchild = c; c->rchild = tmp1; } else if(flag == 1) { //在右邊插入樹 tmp1 = tmp->rchild; tmp->rchild = c; c->rchild = tmp1; } else { return ERROR; } break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } int deleteChild_BiTree(BiTree *btree, BiLNode *e, int flag) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; if(tmp == e) { if(flag == 0) { destroy_BiTree(&tmp->lchild); } else if(flag == 1) { destroy_BiTree(&tmp->rchild); } else { return ERROR; } break; } if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; } //先序遞歸遍歷二叉樹 int preOrderTraverse_BiTree(BiTree *btree) { if(btree == NULL) return ERROR; else { printf("%c ", btree->data); preOrderTraverse_BiTree(btree->lchild); preOrderTraverse_BiTree(btree->rchild); } return OK; } //中序遞歸遍歷二叉樹 int inOrderTraverse_BiTree(BiTree *btree) { if(btree == NULL) return ERROR; else { inOrderTraverse_BiTree(btree->lchild); printf("%c ", btree->data); inOrderTraverse_BiTree(btree->rchild); } return OK; } //後序遞歸遍歷二叉樹 int postOrderTraverse_BiTree(BiTree *btree) { if(btree == NULL) return ERROR; else { postOrderTraverse_BiTree(btree->lchild); postOrderTraverse_BiTree(btree->rchild); printf("%c ", btree->data); } return OK; } //層次遞歸遍歷二叉樹(利用隊列實現) int levelOrderTraverse_BiTree(BiTree *btree) { BiLNode *queue[30], *tmp; int front, rear; front = rear = 0; if(btree) { queue[rear++] = btree; while(front != rear) { tmp = queue[front++]; printf("%c ", tmp->data); if(tmp->lchild) queue[rear++] = tmp->lchild; if(tmp->rchild) queue[rear++] = tmp->rchild; } } return OK; }
二叉平衡查找樹AVL詳解 看懂這篇文章所需的知識點 樹、二叉搜索樹、樹高、樹深、層等概念 AVL樹 概念:任意節點的左右子樹的高度差不能大於1的樹即爲AVL樹,是爲了解決在頻繁插入刪除等動態更新下出現的時間複雜度退化的問題,所以平
AVL樹旋轉原理和簡易實現 二叉搜索樹雖然可以提高搜索效率,但是如果插入的數據有序時很有可能變成單支,如果變成單支樹的時候,那麼查找時效率也不高了。因此引入AVL樹。 AVL樹是當向這棵樹插入節點的時候,要保證每個節點的左右子樹的
紅黑樹的旋轉原理和模擬實現 我們瞭解到AVL樹雖然效率很高,但是它是通過多次的旋轉纔到達一個絕對的平衡,旋轉的消耗其實也很大。因此開始引入近似平衡的一棵樹----紅黑樹(RBTree)。紅黑樹每一個節點不是紅色的就是黑色的,它保證
1.給定100億個整數,設計算法找到只出現一次的整數? ①方法一 100億個整數就是400億個字節,42億九千萬是4G,那麼1G就是10億字節,所以要存下100億個整數需要40G的內存空間。因此我們採用位圖100億個整數大概就是1
布隆過濾器 假如現在有40億個ip地址(string類型),然後給你一個ip地址,讓你查找這個ip地址在不在這40億個ip地址裏?我們應該怎麼做呢? 如果用哈希表來處理的話,這裏有40億的數據,數據量太大,因此太佔用空間 如果用
————————————————18.4.18更新有時我們會遇到這樣的問題:在一棵樹上,每次詢問兩點間路徑上的和或者是最值。但我們用搜索時,時間就會到O(n),這樣根本就完不成算法。但樹上剖分就可以縮短修改的時間。樹上剖分的算法簡介我們定
request作爲前後臺交換的橋樑,有重要作用。 request常用的方法有讀參數:public String getParameter(String paramName);讀取屬性public Object getAttribut
1.非空二叉樹的高度 1.1非遞歸算法實現求解非空二叉樹的高度 算法思想:採用層次遍歷的算法,設置變量level記錄當前結點所在的層數,設置變量last指向當前層的最右的結點,每次層次遍歷出隊的時候與last指針比較(fron
考研加油!!!!!!! 1.1樹的重要概念 1.樹是一種重要的非線性結構;在有n個結點的樹中有n-1條邊; 2.在結點個數爲n(n>1)的各棵樹中,深度最小的樹的深度是多少?它有多少葉子結點?多少分支結點?深度最大的樹的深度是多少?它有多
使用stringstream http://blog.csdn.net/xw20084898/article/details/21939811 stringstream 是 C++ 提供的另一個字串型的串流(stream)
1.什麼是線性結構 線性結構是一種有序數據項的集合,其中每個數據項都有唯一的前驅和後繼(除了第一個沒有前驅,最後一個沒有後繼)。新的數據項加入到數據集中時,只會加入到原有某個數據項之前或之後。具有這種性質的數據集,就稱爲線性結構。
一、Trie的介紹: 1、主要應用場景:搜索引擎的自動補全功能:Trie樹+詞頻(概率)權重因子 IP路由:最長前綴匹配,Trie路由算法
先總結有序數組,無序的後面再總結。。 1.以空間換時間法。 算法思想:目標數組array[length],是一個有序數組,比如int array[]={1,1,2,2,4,4,4,4,4,5,5,6,10};總共有13個元素,
數組求和 方法一:直接一次for循環 int GetSum1(int *a,int n) { int sum=0; for (int i=0; i<n;i++) { sum+=a[i];
題目描述 你有一個長爲N寬爲2的牆壁,給你兩種磚頭:一個長2寬1,另一個是L型覆蓋3個單元的磚頭。如下圖: 0 0 0 00 磚頭可以旋轉,兩種磚頭可以無限制提供。你的任務是計算用這兩種來覆蓋N*2的牆壁的覆蓋方法。例如一個2*3