Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

完全二叉树+指向右边的next指针

  • Loading branch information...
commit 71979d2633be16f1aeac8fe3cb5042e3b32fea3c 1 parent 966d242
= authored
Showing with 102 additions and 0 deletions.
  1. +102 −0 populating-next-right-pointers-in-each-node.cpp
View
102 populating-next-right-pointers-in-each-node.cpp
@@ -0,0 +1,102 @@
+
+
+// http://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node/
+
+/*
+
+ 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:
+
+ You may only use constant extra space.
+ You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
+
+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
+
+ */
+
+
+/**
+ * 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) {}
+ * };
+ */
+class Solution {
+public:
+ void connect(TreeLinkNode *root) {
+ if(root==NULL) {
+ return;
+ }
+ preorderTraversal(root);
+
+ }
+
+ // 左孩子连右孩子
+ void connectLeftToRight(TreeLinkNode *node) {
+ if(node->left==NULL) {
+ return;
+ }
+ node->left->next = node->right;
+ }
+
+ // 右孩子连别人的左孩子
+ void connetRightToLeft(TreeLinkNode *node) {
+ if(node->left==NULL){
+ return;
+ }
+ TreeLinkNode *nodeRight = node->left->right;
+ TreeLinkNode *nodeLeft = node->right->left;
+
+ while(nodeRight!=NULL){
+ nodeRight->next = nodeLeft;
+ nodeRight = nodeRight->right;
+ nodeLeft = nodeLeft->left;
+ }
+ }
+
+ void preorderTraversal(TreeLinkNode *root) {
+ connectLeftToRight(root);
+ connetRightToLeft(root);
+ traversal(root->left);
+ traversal(root->right);
+ }
+
+ void traversal(TreeLinkNode *node){
+ if(node==NULL){
+ return;
+ }
+
+ connectLeftToRight(node);
+ connetRightToLeft(node);
+ traversal(node->left);
+ traversal(node->right);
+ }
+};
Please sign in to comment.
Something went wrong with that request. Please try again.