zoukankan      html  css  js  c++  java
  • 二叉树层次遍历串成单链表

    二叉树层序遍历,然后串成一个单链表,不允许用队列,要求空间复杂度为常数

    struct Node {
        int value;
        Node *left;
        Node *right;
        Node *next;
    };
    Node *Func(Node *root) {
        if (NULL == root)
            return NULL;
        Node *p1 = root, *p2 = root;
        p2->next = p2->left;
        if (NULL != p2->left) {
            p2->left->next = p2->right;
        else
            return root;
        if (NULL == p2->right)
            return root;
        p2 = p2->next;
        while (NULL != p2) {
            if (NULL != p2->left) {
                p2->left->next = p2->right;
            }
            if (NULL != p1->right) {
                p1->right->next = p2->left;
            }
            p1 = p1->next;
            p2 = p2->next;
        }
        return root;
    }
    

     leetcode Populating Next Right Pointers in Each Node II

    解法1:

    /**
     * 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;
            TreeLinkNode *p=root,*q,*r=root;
            if(p->left)r=p->left;
            else if(p->right)r=p->right;
            else return;
            TreeLinkNode *work;
            while(p)
            {
                work=r;
                q=p; 
                p=r;
                while(q)
                {
                      if(q->left&&q->left!=r)
                      {
                        work->next=q->left;
                        work=work->next; 
                      }
                      if(q->right&&q->right!=r)
                      {
                        work->next=q->right;
                        work=work->next;
                      }                  
                    q=q->next;
                }
                for(work=r;work;work=work->next)
                {
                    if(work->left){r=work->left;break;}
                    if(work->right){r=work->right;break;}
                } 
                if(work==NULL)break;           
            } 
        }
    };
    

     超牛逼解法,来自leetcode

    class Solution {
    public:
        void connect(TreeLinkNode *root) {        
        while (root) {
            TreeLinkNode * first= NULL; // the first node of next level
            TreeLinkNode * prev = NULL; // previous node on the same level
            for (; root; root=root->next) {
                if (first==NULL) first= root->left?root->left:root->right;
                if (root->left) {
                    if (prev) prev->next = root->left;
                    prev = root->left;
                }
                if (root->right) {
                    if (prev) prev->next = root->right;
                    prev = root->right;
                }
            }
            root = first; // turn to next level
        }
    }
    
  • 相关阅读:
    SQL点滴34—SQL中的大小写
    js关闭和打开页面
    jquery处理checkbox
    CKeditor 配置使用
    .net4.0中的ClientIDMode
    FCKEditor使用说明
    SQL对Xml字段的操作 拓荒者
    c#中BackGroundWorker控件 拓荒者
    C#中DataGradView控件的常用操作 拓荒者
    JavaScript操作Xml 拓荒者
  • 原文地址:https://www.cnblogs.com/tgkx1054/p/3068936.html
Copyright © 2011-2022 走看看