- 浏览: 731379 次
- 性别:
- 来自: 嘉兴
文章分类
- 全部博客 (386)
- Struts1.1 (2)
- Database (18)
- Core Java (15)
- Log4j (4)
- SSH (0)
- Dao (1)
- Architecture Design (1)
- References (2)
- Eclipse&MyEclipse (10)
- Hibernate (7)
- Spring (8)
- JavaMail (1)
- Data Structure And Algorithm (48)
- Struts 2 (2)
- SSI (1)
- SSL (2)
- JSTL (1)
- EJB3 (2)
- NET (2)
- XML (2)
- Components (2)
- Ant (3)
- Multi Thread (1)
- Performance Monitoring (1)
- Web Server (17)
- Oracle (1)
- jQuery (8)
- Regular Expression (1)
- Weblogic (1)
- Exception (1)
- Security (2)
- File Manipulation (1)
- JavaScript (12)
- JVM (2)
- HTML&DIV&CSS (4)
- Android (10)
- Beyond GFW (0)
- Business (0)
- SVN (6)
- 虚拟主机 (1)
- Virtual Host (3)
- My mentality (5)
- OS (15)
- ISPMP (3)
- Magento (5)
- Jsoup&HttpClient (7)
- LINUX (9)
- Database Design (0)
- Power Designer (1)
- TaobaoOpenPlatform (2)
- C/C++ (3)
- Maven (11)
- Quartz (1)
- Load Balance (1)
- Zabbix (4)
- Product&Business (1)
- Pay Interface (1)
- Tomcat (2)
- Redis (1)
- 集群 (1)
- Session (1)
- 共享Session (1)
- Jedis (1)
- jenkins (1)
- 持续集成 (1)
- Web前端 (1)
最新评论
-
aqq331325797:
特意注册账号上来说一句。牛逼!
swagger2.2.2 与 spring cloud feign冲突 -
KitGavinx:
跨顶级域名怎么保持sessionid一致?
Tomcat7集群共享Session 基于redis进行统一管理 -
jaychang:
dujianqiao 写道HI ,能否给一个完整的demo 啊 ...
淘宝订单同步方案 - 丢单终结者 -
GGGGeek:
找了一会儿,感觉mybatis应该没有这种操作,直到发现博主的 ...
mybatis collection list string -
dujianqiao:
HI ,能否给一个完整的demo 啊 ?
淘宝订单同步方案 - 丢单终结者
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
比如将二元查找树
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
分析:本题是微软的面试题。很多与树相关的题目都是用递归的思路来解决,本题也不例外。
我们可以中序遍历整棵树。按照这个方式遍历树,比较小的结点先访问。如果我们每访问一个结点,假设之前访问过的结点已经调整成一个排序双向链表,我们再把调整当前结点的指针将其链接到链表的末尾。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。
#include <stdio.h> #include <stdlib.h> #define N 20 int count = 0; typedef struct tree { int num; struct tree* lchild; struct tree* rchild; }TREE; int add_tree(TREE** T, int num) { if(*T == NULL) { *T = (TREE*)malloc(sizeof(TREE)); (*T)->num = num; (*T)->lchild = NULL; (*T)->rchild = NULL; } else if((*T)->num < num) return add_tree(&((*T)->rchild),num); else return add_tree(&((*T)->lchild),num); } int mid_walk_tree(TREE* T) { if(T!=NULL) { mid_walk_tree(T->lchild); count++; if(count%10 == 0) printf("%d\n",T->num); else printf("%d\t",T->num); mid_walk_tree(T->rchild); } } int convert_node(TREE* T,TREE** L) { if(T == NULL) return 0; TREE* pCurrent = T; if(pCurrent->lchild != NULL) convert_node(pCurrent->lchild, L); pCurrent->lchild = *L; if(*L != NULL) (*L)->rchild = pCurrent; *L = pCurrent; if(pCurrent->rchild != NULL) convert_node(pCurrent->rchild, L); } TREE* tree_2_list(TREE* T) { TREE* L = NULL; convert_node(T, &L); TREE* list_head = L; L->rchild = NULL; while(list_head && list_head->lchild) list_head = list_head->lchild; return list_head; } void print_list(TREE* H) { count = 0; if(H!=NULL) printf("H is not null\n"); else { printf("H is null\n"); return; } while(H!=NULL) { count++; if(count%10 == 0) printf("%d\n",H->num); else printf("%d\t",H->num); H = H->rchild; } } int main(int argc, char *argv[]) { srand((unsigned)time(NULL)); TREE* T = NULL; int num; int i = 0; for(;i<N;i++) { num = rand()%100 + 50; add_tree(&T, num); } printf("tree walk is:\n"); mid_walk_tree(T); TREE* head = tree_2_lis t(T); printf("list walk is:\n"); print_list(head); system("PAUSE"); return 0; }
发表评论
-
【排序算法系列】希尔排序
2015-12-05 16:14 834希尔排序的概述: a[0]...a[n-1 ... -
归并排序
2015-06-20 15:28 891public class MergeSort { pub ... -
插入排序
2015-06-20 15:27 479/** * 插入排序1 容易理解 * * ... -
有序线性链表归并
2013-10-05 11:30 1554#include<stdio.h> #incl ... -
Trie树 应用 Phone List
2012-06-15 11:21 1171Phone List 时间限 ... -
Trie树 单词查找树 键树(JAVA版附分析说明)
2012-06-13 10:27 5164来源于英文“retrieval”. ... -
Trie树 单词查找树 键树
2012-06-12 08:59 1151转自:http://zh.wik ... -
数字金额转中文大写金额
2010-11-26 15:09 1421/** * 用来将数字金额转化成中文大写的金额 ... -
汉诺塔递归算法
2010-11-25 08:17 1347import java.util.Scanner; /* ... -
约瑟夫出圈
2010-11-24 20:45 1091#include<iostream> #incl ... -
SmartHashSet只是为了解释HashSet的原理
2010-07-26 11:11 1356写该类的目的只是为了 ... -
二叉树中序遍历非递归算法
2010-06-29 23:17 1718#include<iostream> usi ... -
二叉树的创建
2010-06-29 23:15 1129#include<iostream> usi ... -
哈弗曼树建立与哈弗曼编码
2010-06-29 23:12 1240#include<iostream> #de ... -
线索二叉树中插入结点
2010-06-29 23:05 1880#include<iostream> usi ... -
二叉排序树的递归与非递归查找
2010-06-29 22:58 2301#include<iostream> usi ... -
二叉树中序线索化及查找某一结点的前驱,后继结点
2010-06-29 22:54 2676#include<iostream> usi ... -
十字链表定义创建查找
2010-06-29 22:44 1314#include<iostream> #defi ... -
稀疏矩阵转置
2010-06-29 22:39 1656#include<iostream> #defi ... -
单链表实现集合并交差操作
2010-06-29 22:34 1982#include<iostream> usi ...
相关推荐
它是一种特殊的二叉搜索树,其中任何节点的两个子树的高度差最多为1。这种特性使得二叉平衡树能够在保持树形结构的同时,保持较高的查询效率。 - **性质**:二叉平衡树的查找效率与树的高度成线性关系,这意味着其...
题目要求不新增任何节点的情况下,将给定的二叉查找树转化为一个排序的双向链表。 **二叉查找树的特性**:二叉查找树是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任意节点的值,小于其右子树中的任意...
- **题目描述**:给定一棵二叉查找树,要求不新增节点的情况下,将其转换为一个排序的双向链表。 - **示例**: - 输入的二叉查找树如下: ``` 10 / \ 6 14 / \ / \ 4 8 12 16 ``` - 输出的排序双向链表应为...
- **双向链表(带哨兵)**:每个节点都有指向前后节点的指针。 - **环形链表(带哨兵)**:最后一个节点指向头节点,形成闭环。 **习题** 1) **反转单向链表**:实现反转单向链表的算法。 2) **根据值删除节点**:...
考生需要熟悉树的各种性质,树和二叉树的存储结构,森林、树和二叉树之间的转换,线索化二叉树,以及二叉树的应用,如二叉排序树、平衡二叉树和Huffman树。二叉树的前、中、后三种遍历方式的算法设计是复习的重点。...
二叉树的应用,如二叉排序树、平衡二叉树(如AVL树和红黑树)以及Huffman树,都是需要深入理解的部分。树的遍历(前序、中序、后序)是历年考试的重点和难点,要求考生能够熟练设计相应的算法。 在选择题中,常见的...
二叉树的应用如二叉排序树、平衡二叉树(AVL树和红黑树)和Huffman树也需要熟练掌握。树的遍历(前序、中序、后序)是常考点,包括递归和非递归算法的设计。 图的相关知识包括图的定义、存储方式以及深度优先搜索和...
- 双向链表支持双向访问,即每个节点都有指向前后两个方向的指针。 - 这种结构使得数据的检索速度更快,特别是在需要频繁地从前向后或从后向前遍历时。 **结论**:正确答案是A。 **14. 设计一个判别表达式中左右...
二叉排序树、平衡二叉树和Huffman树也是考察重点。 5. 图:理解图的定义和存储方式,熟练掌握深度遍历和广度遍历算法,以及基于图的其他算法如最小生成树(PRIM和KRUSKAL算法)、拓扑排序和关键路径问题。 复习时,...