++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
给定一个二叉树
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
填入每个节点的next指针,如果没有右边的节点,那么这个next指针设置为NULL。
初始时候所有歌next指针都设置成NULL。
Note:
例如,
给定下面的这个完全二叉树,
1 / 2 3 / \ / 4 5 6 7
当调用完你的函数后,这个树应该是下面这样子的:
1 -> NULL / 2 -> 3 -> NULL / \ / 4->5->6->7 -> NULL
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Given a binary tree
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
Populate
each next pointer to point to its next right node. If there is no next right
node, the next pointer should be set to NULL
.
Initially,
all next pointers are set to NULL
.
Note:
For
example,
Given the following perfect
binary tree,
1 / 2 3 / \ / 4 5 6 7
After calling your function, the tree should look like:
1 -> NULL / 2 -> 3 -> NULL / \ / 4->5->6->7 -> NULL
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 88 89 90 91 92 93 94 |
#include <iostream> #include <cstdio> #include <stack> #include <vector> #include "BinaryTreeWithNext.h" using namespace std; /** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} * }; */ void connect(TreeLinkNode *root) { if(root == NULL) { return ; } vector<TreeLinkNode *> vec; vec.push_back(root); int count = 1; while(!vec.empty()) { if(count > 1) { vec[0]->next = vec[1]; } else { vec[0]->next = NULL; } if(vec[0]->left != NULL) { vec.push_back(vec[0]->left); } if(vec[0]->right != NULL) { vec.push_back(vec[0]->right); } vec.erase(vec.begin()); count--; if(count == 0) { count = vec.size(); } } } // 树中结点含有分叉, // 1 // / \ // 2 3 // / \ / \ // 4 5 6 7 int main() { TreeLinkNode *pNodeA1 = CreateBinaryTreeNode(1); TreeLinkNode *pNodeA2 = CreateBinaryTreeNode(2); TreeLinkNode *pNodeA3 = CreateBinaryTreeNode(3); TreeLinkNode *pNodeA4 = CreateBinaryTreeNode(4); TreeLinkNode *pNodeA5 = CreateBinaryTreeNode(5); TreeLinkNode *pNodeA6 = CreateBinaryTreeNode(6); TreeLinkNode *pNodeA7 = CreateBinaryTreeNode(7); ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3); ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5); ConnectTreeNodes(pNodeA3, pNodeA6, pNodeA7); connect(pNodeA1); TreeLinkNode *trav = pNodeA1; TreeLinkNode *tmp; while (trav != NULL) { tmp = trav; while(tmp) { cout << tmp->val << " "; tmp = tmp->next; } cout << endl; trav = trav->left; } cout << endl; DestroyTree(pNodeA1); return 0; } |
结果输出:
1
2 3
4 5 6 7
BinaryTreeWithNext.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#ifndef _BINARY_TREE_WITH_NEXT_H_ #define _BINARY_TREE_WITH_NEXT_H_ struct TreeLinkNode { int val; TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} }; TreeLinkNode *CreateBinaryTreeNode(int value); void ConnectTreeNodes(TreeLinkNode *pParent, TreeLinkNode *pLeft, TreeLinkNode *pRight); void PrintTreeNode(TreeLinkNode *pNode); void PrintTree(TreeLinkNode *pRoot); void DestroyTree(TreeLinkNode *pRoot); #endif /*_BINARY_TREE_WITH_NEXT_H_*/ |
BinaryTreeWithNext.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 "BinaryTreeWithNext.h" using namespace std; /** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right, *next; * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} * }; */ //创建结点 TreeLinkNode *CreateBinaryTreeNode(int value) { TreeLinkNode *pNode = new TreeLinkNode(value); return pNode; } //连接结点 void ConnectTreeNodes(TreeLinkNode *pParent, TreeLinkNode *pLeft, TreeLinkNode *pRight) { if(pParent != NULL) { pParent->left = pLeft; pParent->right = pRight; } } //打印节点内容以及左右子结点内容 void PrintTreeNode(TreeLinkNode *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(TreeLinkNode *pRoot) { PrintTreeNode(pRoot); if(pRoot != NULL) { if(pRoot->left != NULL) PrintTree(pRoot->left); if(pRoot->right != NULL) PrintTree(pRoot->right); } } void DestroyTree(TreeLinkNode *pRoot) { if(pRoot != NULL) { TreeLinkNode *pLeft = pRoot->left; TreeLinkNode *pRight = pRoot->right; delete pRoot; pRoot = NULL; DestroyTree(pLeft); DestroyTree(pRight); } } |
【二叉树的递归】06填充每个节点中的下一个正确的指针【Populating Next Right Pointers in Each Node】,布布扣,bubuko.com
【二叉树的递归】06填充每个节点中的下一个正确的指针【Populating Next Right Pointers in Each Node】
原文:http://www.cnblogs.com/codemylife/p/3652398.html