zoukankan      html  css  js  c++  java
  • Data Structure Binary Tree: Connect nodes at same level using constant extra space

    http://www.geeksforgeeks.org/connect-nodes-at-same-level-with-o1-extra-space/

    recursive:

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <stack>
     6 #include <string>
     7 #include <fstream>
     8 using namespace std;
     9 
    10 struct node {
    11     int data;
    12     struct node *left, *right, *next;
    13     node() : data(0), left(NULL), right(NULL), next(NULL) { }
    14     node(int d) : data(d), left(NULL), right(NULL), next(NULL) { }
    15 };
    16 
    17 node *getnext(node *root) {
    18     node *next = root->next;
    19     while (next) {
    20         if (next->left) return next->left;
    21         if (next->right) return next->right;
    22         next = next->next;
    23     }
    24     return NULL;
    25 }
    26 
    27 void _connect(node *root) {
    28     if (!root) return;
    29     if (root->next) _connect(root->next);
    30     if (root->left) {
    31         if (root->right) {
    32             root->left->next = root->right;
    33             root->right->next = getnext(root);
    34         }
    35         else root->left->next = getnext(root);
    36         _connect(root->left);
    37     }
    38     else if (root->right) {
    39         root->right->next = getnext(root);
    40         _connect(root->right);
    41     }
    42     else _connect(root->next);
    43 }
    44 
    45 void connect(node *root) {
    46     if (!root) return;
    47     root->next = NULL;
    48     _connect(root);
    49 }
    50 
    51 int main() {
    52     node *root = new node(10);
    53     root->left = new node(8);
    54     root->right = new node(2);
    55     root->left->left = new node(3);
    56     root->right->right = new node(90);
    57     connect(root);
    58     cout << root->data << "->" << (root->next? root->next->data : -1) << endl;
    59     cout << root->left->data << "->" << (root->left->next? root->left->next->data : -1) << endl;
    60     cout << root->right->data << "->" << (root->right->next? root->right->next->data : -1) << endl;
    61     cout << root->left->left->data << "->" << (root->left->left->next? root->left->left->next->data : -1) << endl;
    62     cout << root->right->right->data << "->" << (root->right->right->next? root->right->right->next->data : -1) << endl;
    63     return 0;
    64 }

    iterative(better)

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 #include <stack>
     6 #include <string>
     7 #include <fstream>
     8 using namespace std;
     9 
    10 struct node {
    11     int data;
    12     struct node *left, *right, *next;
    13     node() : data(0), left(NULL), right(NULL), next(NULL) { }
    14     node(int d) : data(d), left(NULL), right(NULL), next(NULL) { }
    15 };
    16 
    17 node *getnext(node *root) {
    18     node *next = root->next;
    19     while (next) {
    20         if (next->left) return next->left;
    21         if (next->right) return next->right;
    22         next = next->next;
    23     }
    24     return NULL;
    25 }
    26 
    27 void connect(node *root) {
    28     if (!root) return;
    29     root->next = NULL;
    30     while (root) {
    31         node *p = root;
    32         while (p) {
    33             if (p->left) {
    34                 if (p->right) p->left->next = p->right;
    35                 else p->left->next = getnext(p);
    36             }
    37             if (p->right) p->right->next = getnext(p);
    38             p = p->next;
    39         }
    40         if (root->left) root = root->left;
    41         else if (root->right) root = root->right;
    42         else root = root->next;
    43     }
    44 }
    45 
    46 int main() {
    47     node *root = new node(10);
    48     root->left = new node(8);
    49     root->right = new node(2);
    50     root->left->left = new node(3);
    51     root->right->right = new node(90);
    52     connect(root);
    53     cout << root->data << "->" << (root->next? root->next->data : -1) << endl;
    54     cout << root->left->data << "->" << (root->left->next? root->left->next->data : -1) << endl;
    55     cout << root->right->data << "->" << (root->right->next? root->right->next->data : -1) << endl;
    56     cout << root->left->left->data << "->" << (root->left->left->next? root->left->left->next->data : -1) << endl;
    57     cout << root->right->right->data << "->" << (root->right->right->next? root->right->right->next->data : -1) << endl;
    58     return 0;
    59 }
  • 相关阅读:
    自己修改的两个js文件
    .net4缓存笔记
    使用.net的Cache框架快速实现Cache操作
    关于招聘面试(转)
    PHP中获取当前页面的完整URL
    Linux在本地使用yum安装软件(转)
    Phalcon的学习篇-phalcon和devtools的安装和设置
    GY的实验室
    aip接口中对url参数md5加密防篡改的原理
    nginx 多站点配置方法集合(转)
  • 原文地址:https://www.cnblogs.com/yingzhongwen/p/3632068.html
Copyright © 2011-2022 走看看