《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 }

 

你可能感兴趣的:(interview)