本质上是二叉树的root->right->left遍历。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
给定一个二叉树,就地的把他转换成一个链表。
例如:
给定
1 / \ 2 5 / \ \ 3 4 6
转换后的树应该向这样子:
1 \ 2 \ 3 \ 4 \ 5 \ 6
提示:
如果你观察的足够仔细,你会发现,每个还在的右孩子指针指向了,这个节点在前序遍历中的后面的那个节点。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6
The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
迭代版本:
test.cpp:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#include <iostream>
#include <cstdio> #include <stack> #include <vector> #include "BinaryTree.h" using namespace std; /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ void flatten(TreeNode *root) { if (root == NULL) { return ; } stack<TreeNode *> s; s.push(root); TreeNode *tmp; while (!s.empty()) { tmp = s.top(); s.pop(); if (tmp->right) { s.push(tmp->right); } if (tmp->left) { s.push(tmp->left); } tmp->left = NULL; if (!s.empty()) { tmp->right = s.top(); } } } // 树中结点含有分叉, // 6 // / \ // 7 2 // / \ // 1 4 // / \ // 3 5 int main() { TreeNode *pNodeA1 = CreateBinaryTreeNode( 6); TreeNode *pNodeA2 = CreateBinaryTreeNode( 7); TreeNode *pNodeA3 = CreateBinaryTreeNode( 2); TreeNode *pNodeA4 = CreateBinaryTreeNode( 1); TreeNode *pNodeA5 = CreateBinaryTreeNode( 4); TreeNode *pNodeA6 = CreateBinaryTreeNode( 3); TreeNode *pNodeA7 = CreateBinaryTreeNode( 5); ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3); ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5); ConnectTreeNodes(pNodeA5, pNodeA6, pNodeA7); flatten(pNodeA1); TreeNode *trav = pNodeA1; while (trav != NULL) { cout << trav->val << " "; trav = trav->right; } cout << endl; DestroyTree(pNodeA1); return 0; } |
递归版本:
test.cpp:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
#include <iostream> #include <cstdio> #include <stack> #include <vector> #include "BinaryTree.h" using namespace std; /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ void flatten(TreeNode *root) { if(root == NULL) { return ; } if(root->left == NULL && root->right == NULL) { return ; } flatten(root->left); flatten(root->right); TreeNode *tmpright = root->right; /*因为是前序遍历*/ root->right = root->left; root->left = NULL; TreeNode *tmp = root; while(tmp->right) { /*找到右子树的前序遍历的最后一个节点*/ tmp = tmp->right; } tmp->right = tmpright; return ; } // 树中结点含有分叉, // 6 // / \ // 7 2 // / \ // 1 4 // / \ // 3 5 int main() { TreeNode *pNodeA1 = CreateBinaryTreeNode( 6); TreeNode *pNodeA2 = CreateBinaryTreeNode( 7); TreeNode *pNodeA3 = CreateBinaryTreeNode( 2); TreeNode *pNodeA4 = CreateBinaryTreeNode( 1); TreeNode *pNodeA5 = CreateBinaryTreeNode( 4); TreeNode *pNodeA6 = CreateBinaryTreeNode( 3); TreeNode *pNodeA7 = CreateBinaryTreeNode( 5); ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3); ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5); ConnectTreeNodes(pNodeA5, pNodeA6, pNodeA7); flatten(pNodeA1); TreeNode *trav = pNodeA1; while (trav != NULL) { cout << trav->val << " "; trav = trav->right; } cout << endl; DestroyTree(pNodeA1); return 0; } |
结果输出:
6 7 1 4 3 5 2
BinaryTree.h:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#ifndef _BINARY_TREE_H_
#define _BINARY_TREE_H_ struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode( int x) : val(x), left( NULL), right( NULL) {} }; TreeNode *CreateBinaryTreeNode( int value); void ConnectTreeNodes(TreeNode *pParent, TreeNode *pLeft, TreeNode *pRight); void PrintTreeNode(TreeNode *pNode); void PrintTree(TreeNode *pRoot); void DestroyTree(TreeNode *pRoot); #endif /*_BINARY_TREE_H_*/ |
BinaryTree.cpp:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
#include <iostream>
#include <cstdio> #include "BinaryTree.h" using namespace std; /** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ //创建结点 TreeNode *CreateBinaryTreeNode( int value) { TreeNode *pNode = new TreeNode(value); return pNode; } //连接结点 void ConnectTreeNodes(TreeNode *pParent, TreeNode *pLeft, TreeNode *pRight) { if(pParent != NULL) { pParent->left = pLeft; pParent->right = pRight; } } //打印节点内容以及左右子结点内容 void PrintTreeNode(TreeNode *pNode) { if(pNode != NULL) { printf( "value of this node is: %d\n", pNode->val); if(pNode->left != NULL) printf( "value of its left child is: %d.\n", pNode->left->val); else printf( "left child is null.\n"); if(pNode->right != NULL) printf( "value of its right child is: %d.\n", pNode->right->val); else printf( "right child is null.\n"); } else { printf( "this node is null.\n"); } printf( "\n"); } //前序遍历递归方法打印结点内容 void PrintTree(TreeNode *pRoot) { PrintTreeNode(pRoot); if(pRoot != NULL) { if(pRoot->left != NULL) PrintTree(pRoot->left); if(pRoot->right != NULL) PrintTree(pRoot->right); } } void DestroyTree(TreeNode *pRoot) { if(pRoot != NULL) { TreeNode *pLeft = pRoot->left; TreeNode *pRight = pRoot->right; delete pRoot; pRoot = NULL; DestroyTree(pLeft); DestroyTree(pRight); } } |