《Cracking the Coding Interview》——第17章:普通题——题目13

2014-04-29 00:15

题目:将二叉搜索树展开成一个双向链表,要求这个链表仍是有序的,而且不能另外分配对象,就地完成。

解法:Leetcode上也有,递归解法。

代码:


 1 // 17.13 Flatten a binary search tree into a doubly linked list by inorder traversal order.
2 // Use postorder traversal to do the flattening job.
3 #include <cstdio>
4 using namespace std;
5
6 struct TreeNode {
7 int val;
8 TreeNode *left;
9 TreeNode *right;
10 TreeNode(int _val = 0): val(_val), left(nullptr), right(nullptr) {};
11 };
12
13 void flatten(TreeNode *&root, TreeNode *&left_most, TreeNode *&right_most)
14 {
15 if (root == nullptr) {
16 left_most = right_most = nullptr;
17 return;
18 }
19
20 TreeNode *ll, *lr, *rl, *rr;
21 if (root->left != nullptr) {
22 flatten(root->left, ll, lr);
23 root->left = lr;
24 lr->right = root;
25 } else {
26 ll = lr = root;
27 }
28
29 if (root->right != nullptr) {
30 flatten(root->right, rl, rr);
31 root->right = rl;
32 rl->left = root;
33 } else {
34 rl = rr = root;
35 }
36
37 left_most = ll;
38 right_most = rr;
39 }
40
41 void constructBinaryTree(TreeNode *&root)
42 {
43 int val;
44
45 if (scanf("%d", &val) != 1) {
46 root = nullptr;
47 } else if (val == 0) {
48 root = nullptr;
49 } else {
50 root = new TreeNode(val);
51 constructBinaryTree(root->left);
52 constructBinaryTree(root->right);
53 }
54 }
55
56 void deleteList(TreeNode *&head)
57 {
58 TreeNode *ptr;
59
60 while (head != nullptr) {
61 ptr = head;
62 head = head->right;
63 delete ptr;
64 }
65 }
66
67 int main()
68 {
69 TreeNode *root;
70 TreeNode *left_most, *right_most;
71 TreeNode *head;
72 TreeNode *ptr;
73
74 while (true) {
75 constructBinaryTree(root);
76 if (root == nullptr) {
77 break;
78 }
79 flatten(root, left_most, right_most);
80 head = left_most;
81 for (ptr = head; ptr != nullptr; ptr = ptr->right) {
82 printf("%d ", ptr->val);
83 }
84 putchar(‘\n‘);
85 deleteList(head);
86 }
87
88 return 0;
89 }

《Cracking the Coding Interview》——第17章:普通题——题目13,码迷,mamicode.com

时间: 2024-12-19 08:42:46

《Cracking the Coding Interview》——第17章:普通题——题目13的相关文章

《Cracking the Coding Interview》——第17章:普通题——题目14

2014-04-29 00:20 题目:给定一个长字符串,和一个词典.如果允许你将长串分割成若干个片段,可能会存在某些片段在词典里查不到,有些则查得到.请设计算法进行分词,使得查不到的片段个数最少. 解法:用空间换取时间的动态规划算法,首先用O(n^2)的时间判断每一个片段是否在字典里.这个过程其实可以通过字典树来进行加速,时间上能优化一个阶,不过我没写,偷懒用<unordered_set>代表了字典.之后通过O(n)时间的动态规划,dp[i]表示当前位置的查不到的片段的最少个数.对于懂代码的

《Cracking the Coding Interview》——第17章:普通题——题目12

2014-04-29 00:04 题目:给定一个整数数组,找出所有加起来为指定和的数对. 解法1:可以用哈希表保存数组元素,做到O(n)时间的算法. 代码: 1 // 17.12 Given an array of integers and target value, find all pairs in the array that sum up to the target. 2 // Use hash to achieve O(n) time complexity. Duplicates pa

《Cracking the Coding Interview》——第17章:普通题——题目10

2014-04-28 23:54 题目:XML文件的冗余度很大,主要在于尖括号里的字段名.按照书上给定的方式进行压缩. 解法:这题我居然忘做了,只写了一句话的注解.用python能够相对方便地实现,因为有直接的XML工具可以调用.书上的那种要求应该是符合前序遍历规则. 代码: 1 # 17.10 Parse an XML file, and try to save some space by mapping every item name to an integer index. 2 # Ans

《Cracking the Coding Interview》——第17章:普通题——题目7

2014-04-28 23:28 题目:给定一个数字,用英语把它读出来. 解法:ZOJ上有相反的题目.如果我要用中文读书来呢? 代码: 1 // 17.7 Read an integer in English. 2 #include <map> 3 #include <string> 4 using namespace std; 5 6 map<int, string> m; 7 8 void init() 9 { 10 m[0] = "zero";

《Cracking the Coding Interview》——第17章:普通题——题目9

2014-04-28 23:52 题目:设计算法,找出一本书中某个单词的出现频率. 解法:数就行了. 代码: 1 // 17.9 Given a book, find out the occurrences of any given words in it. 2 // Answer: 3 // 1. process the book as a text file. 4 // 2. find all words, definition of a word must be clearly asser

《Cracking the Coding Interview》——第17章:普通题——题目6

2014-04-28 22:49 题目:给定一个整数数组.如果你将其中一个子数组排序,那么整个数组都变得有序.找出所有这样子数组里最短的一个. 解法:线性时间,常数空间内可以解决,思想类似于动态规划.通过正反扫描两次,可以得出这个区间的两端.只要存在i < j并且a[i] > a[j],那么这个区间[i, j]就必须被排序,为了在线性时间内完成算法,我们可以通过不断比较当前元素与当前最大(最小)元素来更新结果.请看代码. 代码: 1 // 17.6 Given an array, if you

《Cracking the Coding Interview》——第17章:普通题——题目8

2014-04-28 23:35 题目:最大子数组和问题. 解法:O(n)解法. 代码: 1 // 17.8 Find the consecutive subarray with maximum sum in an array. 2 // O(n) online algorithm. 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 7 int maximumSum(vector<int>

《Cracking the Coding Interview》——第17章:普通题——题目5

2014-04-28 22:44 题目:猜数字游戏.四个数字,每个都是0~9之间.你每猜一次,我都告诉你,有多少个位置和数字都对(全对),有多少个位置错数字对(半对).比如"6309",你猜"3701",就有1全对,1半对. 解法:依照题意写就可以了. 代码: 1 // 17.5 I am the Master Mind. Guess the number. 2 // When you guessed the right number at the right po

《Cracking the Coding Interview》——第17章:普通题——题目1

2014-04-28 21:45 题目:就地交换两个数,不使用额外的变量. 解法:没说是整数,我姑且先当整数处理吧.就地交换可以用加法.乘法.异或完成,其中乘法和加法都存在溢出问题.三种方法都不能处理交换同一个数的情况,需要条件判断. 代码: 1 // 17.1 Do a swapping in-place. 2 #include <cstdio> 3 using namespace std; 4 5 void swap1(int &x, int &y) 6 { 7 if (x