摘要: 思路:二叉树的先根序列和中根序列,用两个数组preorder和inorder存放,先根序列的第一个元素值preorder[0]应为二叉树的根上的元素值,在另一个数组中查到此值,设为inorder[k]。此时,数组preorder中从preorder[1]到preorder[k]的序列(长度为k)和数组inorder中从inorder[0]到inorder[k-1](长度为k)的序列,恰好分别是根结点左子树的先根序列和中根序列;数组preorder中从preorder[k+1]到preorder[n-1]的序列(长度为n-k-1)和数组inorder中从inorder[k+1]到inorder[ 阅读全文
posted @ 2012-09-10 22:29 毛毛hhmm 阅读(4010) 评论(0) 推荐(0) 编辑
摘要: 思路:用栈的非递归后根遍历二叉树时,遇到结点p时,栈中保存的即为p的所有祖先。利用这一点,在一次遍历中分布找出p和q的所有祖先,再找它们的共同祖先就容易了。时间复杂度:和后根遍历一次二叉树一样,即O(n)。空间复杂度:O(h),h为二叉树的高度。数据结构: struct BinTreeNode; typedef struct BinTreeNode * PBinTreeNode; struct BinTreeNode { char info; PBinTreeNode llink; PBinTreeNode rlink; }; typedef struct Bin... 阅读全文
posted @ 2012-09-10 22:13 毛毛hhmm 阅读(5443) 评论(2) 推荐(0) 编辑
摘要: 思路:按根、左子树、右子树(先根)的顺序遍历给定二叉树,同时,按根、右子树、左子树的顺序创建一棵新的二叉树。时间复杂度;O(n)。空间复杂度:O(h)。程序代码: BinTree create_mirror(BinTree t) { BinTree mirror; if(t == NULL) return NULL; mirror = (BinTree)malloc(sizeof(struct BinTreeNode)); mirror->info = t->info; mirror->rlink = create_mirror(t->llink);... 阅读全文
posted @ 2012-09-10 21:26 毛毛hhmm 阅读(268) 评论(0) 推荐(0) 编辑
摘要: 1.程序代码(高度): int depth(BinTree t) { if(t == NULL) return 0; int dl = depth(t->llink); int dr = depth(t->rlink); return (dl>dr ? dl : dr)+1; }2.程序代码(结点数): int num_of_nodes(BinTree t) { if(t == NULL) return 0; return 1+num_of_nodes(t->llink)+num_of_nodes(t->rlink); }3.... 阅读全文
posted @ 2012-09-10 21:21 毛毛hhmm 阅读(8727) 评论(0) 推荐(1) 编辑
摘要: 1.递归算法: void PreOrder(BNode p) { if(p == NULL) return; PreOrder(p->lchild); PreOrder(p->rchild); visit(p); }2.非递归算法: 程序代码: struct Elem { BNode ptr; int tag; }; void nPostOrder(BTree btree) { stack s; Elem s_node; BNode p; if(btree ==... 阅读全文
posted @ 2012-09-10 21:14 毛毛hhmm 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 1.递归算法: void PreOrder(BNode p) { if(p == NULL) return; PreOrder(p->lchild); visit(p); PreOrder(p->rchild); }2.非递归算法: 思路:从二叉树的根结点,令变量c为根结点。若c不为空时,则令c沿其左子女结点前进,在前进过程中,把所经历的结点逐个压入栈中,当c为空时,弹出栈顶元素送给c,并访问该结点,再令c为当前结点的右子女结点。重复上述过程,当c为空并且栈也为空时,遍历结束。 程序代码: void nInOrder(BNode btree)... 阅读全文
posted @ 2012-09-10 20:44 毛毛hhmm 阅读(433) 评论(0) 推荐(0) 编辑
摘要: 1.递归算法: void PreOrder(BNode p) { if(p == NULL) return; visit(p); PreOrder(p->lchild); PreOrder(p->rchild); }2.非递归算法: 数据结构: typedef PBinTreeNode DataType; //栈元素的类型是PBinTreeNode struct SeqStack { DataType s[MAXNUM]; int t; }; typedefstruct SeqStack * PS... 阅读全文
posted @ 2012-09-10 20:24 毛毛hhmm 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 思路:采用递归的思想,递归调用本算法来计算根结点的每棵子树的结点个数,并将它们相加,之后再加1(根结点),就得到该树的结点个数。时间复杂度:每个结点访问一次,时间代价为O(n)。空间复杂度:递归栈的深度为O(h),h为树的高度。程序代码: int numbew_of_node(CSTree t) { PCSNode p1; int num; if(t == NULL) return 0; for(p1 = t->lchild,num = 1;p1 != NULL; p1 = p1->rsibling) num += numbew_of_node(... 阅读全文
posted @ 2012-09-10 20:13 毛毛hhmm 阅读(834) 评论(0) 推荐(0) 编辑
摘要: 思路:采用递归的思想,先判断两棵树t1和t2的根结点的元素是否相同,再判断两棵树根结点的子树个数是否相等,最后通过多次递归调用本算法来判断:是否存在两棵树根结点的子树集之间的一个匹配(或一一对应),使得每一对子树相等。算法中用到了一个临时数组temp[]来存放两棵树根结点的子树的匹配信息,temp[i]=j表示t1的第i棵子树与t2的第j棵子树相匹配。程序代码: int equal(CSTree t1,CSTree t2) { PCSNode p1,p2; int n1,n2,i; int *temp; if(t1 == NULL && t2 == NULL) ... 阅读全文
posted @ 2012-09-10 20:03 毛毛hhmm 阅读(1116) 评论(0) 推荐(0) 编辑
摘要: 思路:采用递归的思想, 先判断两棵树的根节点的元素是否相同,再递归调用本算法依次判断两棵树根结点的每对子树是否相同。时间复杂度:每个结点访问一次,故时间代价为O(n)。空间复杂度:递归栈空间的大小与树的高度成正比。程序代码: int same(CSTree t1,CSTree t2) { PCSNode p1,p2; if(t1 == NULL && t2 == NULL) return 1; if( (t1 != NULL && t2 ==NNULL) || (t1 == NULL && t2 != NULL) ) return 0; if(( 阅读全文
posted @ 2012-09-10 19:29 毛毛hhmm 阅读(725) 评论(0) 推荐(0) 编辑
摘要: 数据结构: struct BinTreeNode; typedef struct BinTreeNode * PBinTreeNode; struct BinTreeNode { int info; PBinTreeNode llink; PBinTreeNode rlink; }; typedef struct BinTreeNode * BinTree;程序代码: PBinTreeNode parent_btree(PBinTreeNode p,BinTree t) { PBinTreeNode r; if(p == NULL) re... 阅读全文
posted @ 2012-09-10 19:05 毛毛hhmm 阅读(2753) 评论(0) 推荐(0) 编辑
摘要: 数据结构: struct CSNode; typedef struct CSNode * PCSNode; struct CSNode { DataType info; PCSNode lchild; PCSNode rsibling; }; typedef struct CSNode *CSTree; //树定义为根结点的指针程序代码: PCSNode parent_cstree(PCSNode p,CSTree t) { PCSNode q,r; if(p == NULL) return NULL; if(p == t |... 阅读全文
posted @ 2012-09-10 18:56 毛毛hhmm 阅读(799) 评论(0) 推荐(0) 编辑
摘要: 1.具有n个结点的完全二叉树的高度为log2n(向下取整)。2.对一棵有n个结点的完全二叉树按层次次序从1开始编号,则对任一结点i>1,其双亲结点是i/2(向下取整)。3.采用链式方法存储N个结点的二叉树,该二叉树中共有2N个指针域,其中非空指针N-1个。4.有28个结点的二叉树的最大高度为27(即所有非叶结点都只有一个子结点),最小高度为4(log228 )。5.3个结点A,B,C可以构成30种不同的二叉树(满二叉树,左斜树,右斜树,左旋树,右旋树,每种三个结点有6种排列)。6.按中根次序遍历二叉树的结果为abc,则有5种不同形态的二叉树可以得到这一遍历结果(分别以a,b,c为根画出对 阅读全文
posted @ 2012-09-10 18:48 毛毛hhmm 阅读(632) 评论(0) 推荐(0) 编辑