美文网首页
笔试刷题-头条2018-05-31

笔试刷题-头条2018-05-31

作者: Dodo159753 | 来源:发表于2018-05-31 09:51 被阅读0次

题目描述

/** 
题目描述 
以下函数用于将一颗二叉搜索树转换成一个有序的双向链表。 
要求不能创建任何新的节点,只能调整树种节点指针的指向。 
 
如输入下图中左边的二叉搜索树,则输出转换后的排序双向链表: 
 
      10 
 
    /      \ 
 
   6      14 
 
  /  \      /  \ 
 
4   8  12  16 
 
转换成: 
 
 4 <=> 6 <=> 8 <=> 10 <=> 12  <=> 14 <=> 16 
 
*/   

思路如下:
采用的是bfs的思想,从root开始,然后依次放入其lch rch分别处理指针,由于要标记什么节点已经处理过了,但是这里可以不用,由于原来是树没有环,但是双向链表是有环的图,所以可以通过如此判断有无换然后判断什么指针已经处理过了,然后采用bfs遍历一遍树,同时修改指针即可。若一个当前的node->left=node->left->right形成换,那么node->left不用再被处理了

转化代码如下:

struct Node{  
    int val=-1;  
    Node *left=NULL;  
    Node *right=NULL;  
    Node(){}  
    Node(int val){  
        this->val = val;  
        this->left = NULL;  
        this->right = NULL;  
    }  
};  
Node *Convert(Node *root){  
    if(root==NULL)  
        return root;  
    Node *listHead = root;  
    while(listHead->left!=NULL)  
        listHead = listHead->left;  
    //重构  
    queue<Node*> que;  
    que.push(root);  
    set<Node*> marked;  
    while(!que.empty()){  
        Node *cur = que.front();  
        que.pop();  
        if(cur->left && (cur->left->right!=cur)){  
            //先入队列  
            que.push(cur->left);  
            Node *curLeft = cur->left;  
            while(curLeft->right)  
                curLeft = curLeft->right;  
            //改动指针  
            cur->left = curLeft;  
            curLeft->right = cur;  
        }  
        if(cur->right && (cur->right->left!=cur)){  
            //先入队列  
            que.push(cur->right);  
            Node *curRight = cur->right;  
            while(curRight->left)  
                curRight = curRight->left;  
            //改动指针  
            cur->right = curRight;  
            curRight->left = cur;  
        }  
    }  
    return listHead;  
}  

测试题目例子代码:

int main(){
    Node *n1 = new Node(10);
    Node *n2 = new Node(6);
    Node *n3 = new Node(14);
    Node *n4 = new Node(4);
    Node *n5 = new Node(8);
    Node *n6 = new Node(12);
    Node *n7 = new Node(16);
    n1->left = n2;
    n1->right = n3;
    n2->left = n4;
    n2->right = n5;
    n3->left = n6;
    n3->right = n7;
    Node *listHead = Convert(n1);
    Node *reversedListHead;
    Node *cur = listHead;
    while(cur){
        printf("%d ", cur->val);
        if(!cur->right)
            reversedListHead = cur;
        cur = cur->right;
    }
    printf("\n");
    cur = reversedListHead;
    while(cur){
        printf("%d ", cur->val);
        cur = cur->left;
    }
    return 0;
}

相关文章

  • 笔试刷题-头条2018-05-31

    题目描述 思路如下:采用的是bfs的思想,从root开始,然后依次放入其lch rch分别处理指针,由于要标记什么...

  • 笔试刷题-头条2018-05-31

    思路如下:由于只有两个字符,就找其中一个字符来变,另一个也变,看最后可以组成的最长字符串 维护两个列表去记录两个字...

  • 笔试刷题-头条2018-06-01

    题目描述: 思路如下:把用户按照k值排序,然后用两次二分查找找出了每次查询所有符合条件的其k值与查询相同的用户,然...

  • 笔试刷题-头条2018-06-02

    题目介绍: 思路简介:colorPosTable[c]表示第c种颜色出现的位置(按照顺时针录入) colorSet...

  • 笔试刷题-头条2018-07-08

    题目描述: 思路如下: 设dp[i]为到达i门,并且进入次数为偶数时需要移动的次数 一开始为0 第二次进入1要两次...

  • 笔试刷题-头条2018-07-10

    题目描述: 思路如下: 类似柱状图扩展长方形求最大面积即可用栈更新一个点可以向左扩展到哪里,向右可以扩展到哪里然后...

  • 笔试刷题-头条2018-07-03

    题目描述: 思路如下: 把难度从小到大排序,然后用一个标记题目是否用于考试然后对于三个连续的题目按遍历顺序mark...

  • 笔试刷题-头条2018-07-07

    题目描述: 思路如下: 1.最后一个分配的房间里的人数就是最小值,这种情况这个房间里的人就是先前被请出去了,也就是...

  • 笔试刷题-头条2018-07-06

    题目描述: 思路如下: 维护一个表每个每行存放同样字符之间的位置(按原来顺序摆放)在位置向量中dp[i][j] =...

  • 笔试刷题-头条2018-07-05

    题目描述: 思路如下: 根据一个prefix先不断乘10达到n以内最大,然后加上尾巴项具体看代码,精确prefix...

网友评论

      本文标题:笔试刷题-头条2018-05-31

      本文链接:https://www.haomeiwen.com/subject/hdnfsftx.html