-
证明:在一棵有n个结点的二叉查找树中,刚好有n-1种可能的旋转
2011-05-16 22:02:00那么对于n=k+1时,也就是我们在原来的二叉查找树中添加了一个结点,这个结点最终一定是二叉查找树的一个叶结点,其父结点一定存在(k>1),这个叶结点可能是其父结点的左子结点,也可能是其父结点的右子结点。...用数学归纳法证明:
首先对n=1时,对于二叉查找树,只有一个结点,也就是根结点,这时无法旋转,因此有0(n-1)种可能的旋转,命题成立。
假设对于n=k(k>1)时,对于二叉查找树,有k-1种可能的旋转。
那么对于n=k+1时,也就是我们在原来的二叉查找树中添加了一个结点,这个结点最终一定是二叉查找树的一个叶结点,其父结点一定存在(k>1),这个叶结点可能是其父结点的左子结点,也可能是其父结点的右子结点。如果是左子结点,那么相对于原二叉查找树,增加了一个右旋操作;如果是右子结点,那么增加了一个左旋的操作。这样加上原来的k-1种旋转可能,则对于有k+1个结点的新二叉查找树共有k种旋转可能。
这样我们就证明了上述归纳假设的正确性。
-
设二叉排序树中有n个结点,则在二叉排序树的平均平均查找长度为
2016-01-05 14:44:03设二叉排序树中有n个结点,则在二叉排序树的平均平均查找长度为( )。 (A) O(1) (B) O(log2n) (C) (D) O(n) -
剑指offer-二叉搜索树的第k个结点
2016-11-07 20:07:22例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。分析 通过中序遍历列出节点顺序列表 更加优化的解决办法是直接在遍历的时候将k值带进去O(k)-O(n)import java.util.ArrayList; /* ...题目描述
给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
分析
通过中序遍历列出节点顺序列表
更加优化的解决办法是直接在遍历的时候将k值带进去O(k)-O(n)import java.util.ArrayList; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { if (pRoot == null) { return null; } ArrayList<TreeNode> list = new ArrayList<TreeNode>(); inOrderTree(pRoot, list); if (list.size() < k || k == 0) { return null; } else { return list.get(k-1); } } private void inOrderTree(TreeNode pRoot, ArrayList<TreeNode> list) { if(pRoot == null) { return; } inOrderTree(pRoot.left, list); list.add(pRoot); inOrderTree(pRoot.right, list); } }
O(k):
int cnt = 0; TreeNode KthNode(TreeNode pRoot, int k) { if (pRoot == null) return null; TreeNode t = KthNode(pRoot.left, k); if (t != null) return t; if (++cnt < k) return KthNode(pRoot.right, k); else if (cnt == k) return pRoot; return null; }
-
程序员面试金典: 9.4树与图 4.7找出二叉树种某两个结点的第一个共同祖先---O(N)解法
2017-01-02 15:38:11问题:设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先。不得将额外的结点储存在另外的数据结构中。 注意:这不一定是二叉查找树。 是否解出:解出,但不是最优 书上解法: 设两个结点为p,q 情况1:...#include <iostream> #include <stdio.h> #include <vector> #include <string> using namespace std; /* 问题:设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先。不得将额外的结点储存在另外的数据结构中。 注意:这不一定是二叉查找树。 是否解出:解出,但不是最优 书上解法: 设两个结点为p,q 情况1:如果p,q在根节点的两侧,那么直接返回根节点(牛逼,没有想到利用根节点两侧结点的共同祖先就是根节点),由于 情况2:如果p,q中有一个为根节点,则直接返回根节点(考虑到p,q在一条链上的情况,很关键) 由于从根节点一直向下做上述判断,就一定会进入情况1或情况2,从根节点向下,对每个结点进行上述处理,时间复杂度为O(N) 输入: 7(元素个数) 2(待寻找共同祖先的第一个结点的值) 5(待寻找共同祖先的第二个结点的值) 6 3 9 1 4 2 5(所有各个结点的值) d(表示当前第1个结点有两个孩子,后续跟两个孩子结点下标) 2 3 d 4 5 z(表示当前第i个结点没有孩子结点) r(表示当前第i个结点只有一个右孩子结点,后面跟该右孩子结点下标) 6 r 7 z z 7 2 9 6 3 9 1 4 2 5 d 2 3 d 4 5 z r 6 r 7 z z 输出: 3(共同祖先的值,如果没有,返回NULL) 6 关键: 1 设两个结点为p,q 情况1:如果p,q在根节点的两侧,那么直接返回根节点(牛逼,没有想到利用根节点两侧结点的共同祖先就是根节点),由于 情况2:如果p,q中有一个为根节点,则直接返回根节点(考虑到p,q在一条链上的情况,很关键) 由于从根节点一直向下做上述判断,就一定会进入情况1或情况2,从根节点向下,对每个结点进行上述处理,时间复杂度为O(N) //如果两个结点中有一个为根节点,直接返回该结点即可 if(node1 == head) { return node1; } if(node2 == head) { return node2; } //如果两个结点分别位于根节点的两侧,则直接返回根节点 bool isNode1OnLeft = isChildNode(head->_pLeft , node1); bool isNode2OnLeft = isChildNode(head->_pLeft , node2); if(isNode1OnLeft != isNode2OnLeft) { return head; } //如果两个结点位于根节点同一侧,则令根节点为其同一侧子树的根节点 else { //如果都在根节点左侧 if(isNode1OnLeft) { return findCommonAncestor(head->_pLeft, node1 , node2); } else { return findCommonAncestor(head->_pRight, node1 , node2); } } 2 判断一个结点A是否是某个结点P的子孙结点,如果结点等于P的左孩子结点或为P的右孩子结点,是;否则, 从P的左孩子和右孩子分别为结点,继续搜索结点A是否为其孩子结点的孩子结点 //实际上应该是判断当前结点是否为某个节点的孩子结点 bool isChildNode(TreeNode* head , TreeNode* node) { if(NULL == node) { return false; } //如果根节点都为空了,说明当前结点不是根节点的子孙结点 if(NULL == head) { return false; } if(node == head) { return true; } else { //递归处理,注意如果一个结点都不在根节点的左右孩子结点中,那么这个结点必定不是根节点的子孙结点,这里用"||" return isChildNode(head->_pLeft , node) || isChildNode(head->_pRight , node); } } */ typedef struct TreeNode { TreeNode* _pLeft; TreeNode* _pRight; TreeNode* _pParent; int _value; }TreeNode; const int MAXSIZE = 10000; int g_index; TreeNode g_treeNodeArray[MAXSIZE]; TreeNode* createTreeNode() { ++g_index; g_treeNodeArray[g_index]._pLeft = g_treeNodeArray[g_index]._pRight = g_treeNodeArray[g_index]._pParent = NULL; return &g_treeNodeArray[g_index]; } //建树 void buildTree(vector<int>& vecData) { int size = vecData.size(); g_index = 0; if(vecData.empty()) { return; } string childFlag; int leftChild, rightChild; for(int i = 1 ; i <= size ; i++ ) { cin >> childFlag; g_treeNodeArray[i]._value = vecData.at(i-1); if("d" == childFlag) { cin >> leftChild >> rightChild; g_treeNodeArray[i]._pLeft = &g_treeNodeArray[leftChild]; g_treeNodeArray[leftChild]._pParent = &g_treeNodeArray[i]; g_treeNodeArray[i]._pRight = &g_treeNodeArray[rightChild]; g_treeNodeArray[rightChild]._pParent = &g_treeNodeArray[i]; } else if("r" == childFlag) { cin >> rightChild; g_treeNodeArray[i]._pRight = &g_treeNodeArray[rightChild]; g_treeNodeArray[rightChild]._pParent = &g_treeNodeArray[i]; } else if("l" == childFlag) { cin >> leftChild; g_treeNodeArray[i]._pLeft = &g_treeNodeArray[leftChild]; g_treeNodeArray[leftChild]._pParent = &g_treeNodeArray[i]; } } } //根据结点值找到指定结点,如果同时出现多个结点的值与给定值相同,就返回最先找到的结点 TreeNode* findNode(TreeNode* head , int value) { if(NULL == head) { return NULL; } if(value == head->_value) { return head; } TreeNode* leftChild = NULL; TreeNode* rightChild = NULL; if(head->_pLeft) { leftChild = findNode(head->_pLeft , value); } //在左子树找到,就直接返回结果;否则,递归查找右子树 if(leftChild != NULL) { return leftChild; } else { if(head->_pRight) { return findNode(head->_pRight , value); } else { return NULL; } } } //寻找根节点 TreeNode* findRoot(TreeNode* node) { if(NULL == node) { return NULL; } if(NULL == node->_pParent) { return node; } else { return findRoot(node->_pParent); } } //判断当前结点是位于根节点的哪一侧,关键是自底向上遍历还是自上向下遍历,应该是自上向下遍历,自下向上遍历不能指示方向 //实际上应该是判断当前结点是否为某个节点的孩子结点 bool isChildNode(TreeNode* head , TreeNode* node) { if(NULL == node) { return false; } //如果根节点都为空了,说明当前结点不是根节点的子孙结点 if(NULL == head) { return false; } if(node == head) { return true; } else { //递归处理,注意如果一个结点都不在根节点的左右孩子结点中,那么这个结点必定不是根节点的子孙结点,这里用"||" return isChildNode(head->_pLeft , node) || isChildNode(head->_pRight , node); } } //寻找两个结点的最近公共祖先,从上向下遍历 TreeNode* findCommonAncestor(TreeNode* head, TreeNode* node1 , TreeNode* node2) { //鲁棒性 if(NULL == head || NULL == node1 || NULL == node2) { return NULL; } //如果两个结点中有一个为根节点,直接返回该结点即可 if(node1 == head) { return node1; } if(node2 == head) { return node2; } //如果两个结点分别位于根节点的两侧,则直接返回根节点 bool isNode1OnLeft = isChildNode(head->_pLeft , node1); bool isNode2OnLeft = isChildNode(head->_pLeft , node2); if(isNode1OnLeft != isNode2OnLeft) { return head; } //如果两个结点位于根节点同一侧,则令根节点为其同一侧子树的根节点 else { //如果都在根节点左侧 if(isNode1OnLeft) { return findCommonAncestor(head->_pLeft, node1 , node2); } else { return findCommonAncestor(head->_pRight, node1 , node2); } } } void process() { int nodeNum ; int firstValue; int secondValue; int value; vector<int> vecData; while(cin >> nodeNum >> firstValue >> secondValue) { vecData.clear(); for(int i = 0 ; i < nodeNum ; i++) { cin >> value; vecData.push_back( value ); } //输入完成接下来需要建树 buildTree(vecData); //建树完成后,就是寻找共同父节点 TreeNode* root = findRoot(&g_treeNodeArray[1]); TreeNode* node1 = findNode(root , firstValue); TreeNode* node2 = findNode(root , secondValue); TreeNode* ancestorNode = findCommonAncestor(root , node1 , node2); if(ancestorNode) { cout << ancestorNode->_value << endl; } else { cout << "NULL" << endl; } } } int main(int argc , char* argv[]) { process(); getchar(); return 0; }
-
程序员面试金典: 9.4树与图 4.7找出二叉树种某两个结点的第一个共同祖先---O(N^2)解法
2017-01-02 14:21:43问题:设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先。不得将额外的结点储存在另外的数据结构中。 注意:这不一定是二叉查找树。 分析:一种方式是根据结点,向上遍历,得到从当前结点到根节点的一个...#include <iostream> #include <stdio.h> #include <vector> #include <string> using namespace std; /* 问题:设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先。不得将额外的结点储存在另外的数据结构中。 注意:这不一定是二叉查找树。 分析:一种方式是根据结点,向上遍历,得到从当前结点到根节点的一个链表,设长链表的长度为L1,设短链表的长度为L2, 将两个链表中较长的链表先走L1-L2步,然后寻找共同结点。 问题中说明:不得将结点额外存储。而采用链表的方式是需要额外存储结构的。如果不能用额外存储结构只能用这样的方式。 O(n^2)方法,设两个结点分别为n1,n2, 遍历n1,设当前结点为c,如果n1!=n2,令n2=n2->parent, 输入: 7(元素个数) 2(待寻找共同祖先的第一个结点的值) 5(待寻找共同祖先的第二个结点的值) 6 3 9 1 4 2 5(所有各个结点的值) d(表示当前第1个结点有两个孩子,后续跟两个孩子结点下标) 2 3 d 4 5 z(表示当前第i个结点没有孩子结点) r(表示当前第i个结点只有一个右孩子结点,后面跟该右孩子结点下标) 6 r 7 z z 7 2 9 6 3 9 1 4 2 5 d 2 3 d 4 5 z r 6 r 7 z z 输出: 3(共同祖先的值,如果没有,返回NULL) 6 */ typedef struct TreeNode { TreeNode* _pLeft; TreeNode* _pRight; TreeNode* _pParent; int _value; }TreeNode; const int MAXSIZE = 10000; int g_index; TreeNode g_treeNodeArray[MAXSIZE]; TreeNode* createTreeNode() { ++g_index; g_treeNodeArray[g_index]._pLeft = g_treeNodeArray[g_index]._pRight = g_treeNodeArray[g_index]._pParent = NULL; return &g_treeNodeArray[g_index]; } //建树 void buildTree(vector<int>& vecData) { int size = vecData.size(); g_index = 0; if(vecData.empty()) { return; } string childFlag; int leftChild, rightChild; for(int i = 1 ; i <= size ; i++ ) { cin >> childFlag; g_treeNodeArray[i]._value = vecData.at(i-1); if("d" == childFlag) { cin >> leftChild >> rightChild; g_treeNodeArray[i]._pLeft = &g_treeNodeArray[leftChild]; g_treeNodeArray[leftChild]._pParent = &g_treeNodeArray[i]; g_treeNodeArray[i]._pRight = &g_treeNodeArray[rightChild]; g_treeNodeArray[rightChild]._pParent = &g_treeNodeArray[i]; } else if("r" == childFlag) { cin >> rightChild; g_treeNodeArray[i]._pRight = &g_treeNodeArray[rightChild]; g_treeNodeArray[rightChild]._pParent = &g_treeNodeArray[i]; } else if("l" == childFlag) { cin >> leftChild; g_treeNodeArray[i]._pLeft = &g_treeNodeArray[leftChild]; g_treeNodeArray[leftChild]._pParent = &g_treeNodeArray[i]; } } } //根据结点值找到指定结点,如果同时出现多个结点的值与给定值相同,就返回最先找到的结点 TreeNode* findNode(TreeNode* head , int value) { if(NULL == head) { return NULL; } if(value == head->_value) { return head; } TreeNode* leftChild = NULL; TreeNode* rightChild = NULL; if(head->_pLeft) { leftChild = findNode(head->_pLeft , value); } //在左子树找到,就直接返回结果;否则,递归查找右子树 if(leftChild != NULL) { return leftChild; } else { if(head->_pRight) { return findNode(head->_pRight , value); } else { return NULL; } } } //寻找根节点 TreeNode* findRoot(TreeNode* node) { if(NULL == node) { return NULL; } if(NULL == node->_pParent) { return node; } else { return findRoot(node->_pParent); } } //寻找两个结点的最近公共祖先,不使用额外的数据结构存放结点 TreeNode* findCommonAncestor(TreeNode* node1 , TreeNode* node2) { TreeNode* tempNode2 = node2; TreeNode* tempNode1 = node1; while(tempNode2) { //遍历第一个结点链表,看是否找到与当前结点相同的结点 while(tempNode1) { if(tempNode1->_value == tempNode2->_value) { return tempNode1; } else { tempNode1 = tempNode1->_pParent; } } //到这里就是把结点1所在链表的所有结点都遍历完,且没有找到共同祖先,此时就应该使得结点2等于结点2的父节点 tempNode2 = tempNode2->_pParent; tempNode1 = node1; } //如果最终没有找到共同祖先,返回空 return NULL; } void process() { int nodeNum ; int firstValue; int secondValue; int value; vector<int> vecData; while(cin >> nodeNum >> firstValue >> secondValue) { vecData.clear(); for(int i = 0 ; i < nodeNum ; i++) { cin >> value; vecData.push_back( value ); } //输入完成接下来需要建树 buildTree(vecData); //建树完成后,就是寻找共同父节点 TreeNode* root = findRoot(&g_treeNodeArray[1]); TreeNode* node1 = findNode(root , firstValue); TreeNode* node2 = findNode(root , secondValue); TreeNode* ancestorNode = findCommonAncestor(node1 , node2); if(ancestorNode) { cout << ancestorNode->_value << endl; } else { cout << "NULL" << endl; } } } int main(int argc , char* argv[]) { process(); getchar(); return 0; }
-
BJFU_数据结构习题_290基于非递归的二叉排序树的结点的查找和插入
2019-11-26 15:59:01290基于非递归的二叉排序树的结点的查找和插入 描述 已知二叉树T的结点形式为(llink,data,count,rlink),在树中查找值为x的结点,若找到,则计数(count)加1;否则,作为一个新结点插入树中,插入后仍为二叉排序... -
一棵完全二叉树上有1001个结点,其中叶子结点的个数是();高度为5的完全二叉树中最少有()个结点; 设一...
2020-04-19 20:24:08一棵完全二叉树上有1001个结点,其中叶子结点的个数是501。 满二叉树应是210-1=1023个节点,这里是1001个节点,完全二叉树比满二叉树少在最后一行,少了1023-1001=22个节点,满二叉树最后一行是210-1=512个节点;... -
PTA天梯赛-二叉搜索树的2层结点统计
2020-11-26 23:35:35二叉搜索树或者是一棵空树,或者是具有...输入格式:输入在第一行给出一个正整数 N (≤1000),为插入数字的个数。第二行给出 N 个 [−1000,1000] 区间内的整数。数字间以空格分隔。 输出格式:在一行中输出最下面 2 层 -
面试刷题知识点汇总2.17(二叉排序树,快速排序,二叉树结点个数)
2019-02-17 21:52:27二叉排序树通俗理解: 所有结点值都比左子树上的值大,比右子树上的值小。 知识点: 中序遍历二叉排序树可以得到一个有序...因为快速排序的这种性质,导致在序列本身有序的情况下效果最差,复杂度为O(n^2);而在无序... -
L2-3 二叉搜索树的2层结点统计 (25分)
2020-11-20 09:31:43L2-3 二叉搜索树的2层结点统计 (25分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:若它的... 输入在第一行给出一个正整数 N (≤1000),为插入数字的个数。第二行给出 N 个 [−1000,1000] 区间内的 -
二叉搜索树两个随机结点的最近公共祖结点_数据结构里各种难啃的“树”,一文搞懂它...
2020-11-23 13:14:31一、 二叉树二叉树是每个节点最多有两个子树的树结构。它有五种基本形态:二叉树可以是...2 两个特别的二叉树完全二叉树:对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n... -
二叉搜索树
2019-08-08 18:31:31什么是二叉搜索树? 二叉搜索树又叫二叉排序树,空树是特殊的二叉搜索... 对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数... -
二叉搜索树两个随机结点的最近公共祖结点_通过2-3-4树理解红黑树
2020-11-21 19:01:18在研究红黑树时吃了不少苦头,原因有二:红黑树的插入和删除非常复杂,很多人并没有理解或完全实现,或实现了的没有任何注释,让人很难参考;网络上红黑树的理解方式较为单一,一般是 双黑、caseN法,而插入和删除的... -
二叉搜索树的2层结点统计 ------ 模拟链表
2020-11-17 20:53:39题目 二叉搜索树或者是一棵空树,或者是具有下列性质的...输入在第一行给出一个正整数 N (≤1000),为插入数字的个数。第二行给出 N 个 [−1000,1000] 区间内的整数。数字间以空格分隔。 输出格式: 在一行中输出最下 -
二叉排序树与堆的区别
2019-06-03 11:34:08在二叉排序树中,每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值,对二叉排序树进行中序遍历得到一个有序...具有n个结点的二叉排序树,其深度取决于给定集合的初始排列顺序,最好情况下其... -
二叉排序树和堆的区别
2015-11-20 12:36:32在二叉排序树中,每个结点的值均大于其左子树上所有结点的值,小于其右子树上所有结点的值,对二叉排序树进行中序遍历得到一个有序序列。所以,二叉排序树是结点... 具有n个结点的二叉排序树,其深度取决于给定集合 -
二叉查找树/二叉排序树/二叉搜索树、二叉平衡(查找)树
2018-07-12 10:39:15二叉树性质: 在二叉树的第 i 层上至多有2i-1个结点。 深度为 k 的二叉树上至多含 2k-1 个结点(k≥1) 对任何一棵二叉树,若它含有n0个叶子结点、n2个度为 ... 如果对一棵有n个结点的完全二叉树的结点按层... -
c++二叉排序树根结点的问题,请大神来回答一下
2016-05-27 04:42:04列如我用构造函数构造了一个BST,那么我怎么查找某一个元素的,因为要输入根结点的指针,但是我不知道根结点的指针 template struct BSTNode { T m_nValue; BSTNode *m_pLeft; BSTNode *m_pRight; }; template ... -
PAT1115 Counting Nodes in a BST 二叉搜索树最后两层结点数量
2020-07-15 15:11:13二叉搜索树 (BST) 递归定义为具有以下属性的二叉树: 若它的左子树不空,则左子树上所有结点的...第二行包含N个整数,表示插入数字序列。 输出格式 以如下格式,在一行中,输出结果树的最后两层的结点数: n1 +... -
中序线索化二叉树数据结构.pdf
2020-04-22 07:02:22中序线索化二叉树数据结构. 当用二叉链表作为二叉树的存储结构时因为每个结点中...点的指针将降低存储空间的效率 与此同时我们可以证明在 n 个结点的二叉链表中含有 n+1 个空指针因为含 n 个结点 的二叉链表中含有 2n -
用向上调整建立一个二叉堆时候如何遍及其根结点?(C++实现)
2019-11-11 18:17:51在这里,我有一个疑惑,我这样建堆是无法遍及root的,假设根结点和其左孩子逆序,这里parent计算的结果是0,无法进入循环,所以根节点总是不能动的 循环结束的条件又无法改变,仅当parent=-1/2取整为0时结束循环,... -
二叉搜索树(BST)的相关问题
2018-04-01 22:14:52前言:在二叉搜索树中,对于每个结点,它的所有左子树结点的元素小于当前节点数据,所有右子树结点大于当前结点。 二叉搜索树的三种常见操作:查找、删除、插入。 查找 在查找操作中,就可以看到二叉搜索树的... -
线索二叉树
2019-09-27 18:31:16前面实现了二叉树的二叉链表表示实现,当用二叉链表作为二叉树的存储结构时,因为每个结点中只有指向其左、右儿子结点的指针,...在n个结点的二叉链表中含有n+1个空指针。因为含n个结点的二叉链表中含有个指针,除... -
二叉堆
2020-02-06 21:42:55二叉堆是一种特殊的堆,是完全二叉树。...如果根节点在数组中的位置是1,第n个位置的子节点分别在2n和 2n+1。因此,第1个位置的子节点在2和3,第2个位置的子节点在4和5。以此类推。这种基于1的数组存储方式便于寻找... -
二叉查找树
2019-09-21 02:38:021.一棵二叉查找树(BST...2.在由N个随机键构造的二叉查找树中,查找命中平均所需的比较次数为~2lnN(约1.39lgN)。 3.在由N个随机键构造的二叉查找树中,插入操作和查找未命中平均所需的比较次数为~2lnN(约1.39lgN... -
二叉排序树与平衡二叉树的实现
2010-12-26 15:25:31另外,含有n个结点的二叉排序树其判定树不是惟一的。对于含有同样一组结点的表,由于结点插入的先后次序不同,所构成的二叉排序树的形态和深度也可能不同。 而在二叉排序树上进行查找时的平均查找长度和二叉树的... -
中序线索化
2017-06-02 18:30:25n个结点的二叉链表中含有n+1个空指针,在n个结点的二叉链表中含有2n-(n-1)=n+1个空指针。可以利用这些空指针,存放指向结点在某种遍历次序下的前驱和后继结点的指针。这种附加的指针称为线索,加上了线索的二叉链表...
收藏数
960
精华内容
384
-
[学习笔记] 基于SSH框架的企业级应用开发之Oracle(一)
-
苏醒Grace v8.5主题去授权无限制版 WordPress主题模板
-
linux基础入门和项目实战部署系列课程
-
Linux下Oracle中sqlplus上下键乱码问题
-
基于SSM实现的房屋租赁系统【附源码】(毕设)
-
海量数据下的分布式存储与计算
-
MySQL 触发器
-
MySQL 函数、用户自定义函数
-
问题集:用于存储我对某些问题集的解决方案的存储库-源码
-
使用SoaML服务架构
-
MySQL 四类管理日志(详解及高阶配置)
-
AIX+Oracle11g+ASM ADD DISK扩容
-
基于用户评论的电子商务平台评分
-
CSS列表收拉效果
-
退出虚拟化环境
-
文件夹-源码
-
提高英语听力
-
项目管理工具与方法
-
js二维码生成
-
CPictureEX-demo-and-src.rar