zoukankan      html  css  js  c++  java
  • 剑指offer-面试题36-二叉搜索树与双向链表-中序遍历

    /*
    题目:
    	将二叉搜索树转化为排序的双向链表,不能创建新的节点,
    	只能调整节点的指向,返回双向链表的头节点。
    */
    /*
    思路:
    	递归。
    	二叉搜索树的中序遍历得到的序列是递增序列。
    	左子树left<=>root<=>右子树right。
    	左链表left<=>root<=>右链表right。
    	对于左链表,我们需要它的最后一个节点;对于右链表,我们需要它的第一个节点。
    	我们设置一个公共节点表示lastNode,函数返回firstNode。
    	将root节点跟在做链表后,将右链表跟在root节点之后,则得到最终结果。
    */
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<cmath>
    #include<stdio.h>
    #include<vector>
    #include<stack>
    #include<queue>
    
    using namespace std;
    
    struct TreeNode {
    	int val;
    	struct TreeNode *left;
    	struct TreeNode *right;
    	TreeNode(int x) :
    			val(x), left(NULL), right(NULL) {
    	}
    };
    
    TreeNode* lastNode = nullptr;
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr || (pRootOfTree->left == nullptr && pRootOfTree->right == nullptr)) {
           lastNode = pRootOfTree;
           return pRootOfTree;
        }
        TreeNode* left = Convert(pRootOfTree->left);
        if(left != nullptr){
            lastNode->right = pRootOfTree;
            pRootOfTree->left = lastNode;
        }
        TreeNode* right = Convert(pRootOfTree->right);
        if(right != nullptr){
            pRootOfTree->right = right;
            right->left = pRootOfTree;
        }
        lastNode = (right == nullptr) ? pRootOfTree : right;
        return (left == nullptr)? pRootOfTree : left;
    
    }
    

       

  • 相关阅读:
    docker
    Flask
    JavaScirpt
    记录片- 走进肯德基 :十亿美元鸡肉店(2015)
    法正(3):扫黑
    法正(2):法雄
    法正(1):年表
    三国皇帝的寡妇秘史(2)
    三国皇帝的寡妇秘史(1)
    程序员的人性思考(下)
  • 原文地址:https://www.cnblogs.com/buaaZhhx/p/11960178.html
Copyright © 2011-2022 走看看