【剑指offer】26.二叉搜索树与双向链表

题目

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。


思路

根据二叉排序树性质,中序遍历得到的序列从小到大序列。因此,在中序遍历的基础上进行改进即可得到双向链表。具体步骤如下:

  1. 初始化尾结点last为空。
  2. 若根结点root为空,则停止交换。否则若root的左子树非空则将递归将左子树调整为双向链表。之后将root的左子树指向last,若last不为空则将last的右子树指向root。
  3. last指向root。若root的右子树非空则将递归将右子树调整为双向链表。
  4. 当树的根节点的左子树不为空时,遍历左子树,找到最小结点并返回。

github链接:JZ26-二叉搜索树与双向链表


C++ 代码

#include 
#include  
using namespace std; 

struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};

class Solution {
	public:
	    TreeNode* Convert(TreeNode* pRootOfTree){
	        if(pRootOfTree == NULL){
	        	return NULL;
			}
			TreeNode* last = NULL;
			Convert2List(pRootOfTree,last);
			while(pRootOfTree->left){
				pRootOfTree = pRootOfTree->left;
			}
			return pRootOfTree;
	    }
	    
	    void Convert2List(TreeNode* root,TreeNode* &last){
	    	if(root == NULL){
	    		return;
			}
	    	if(root->left != NULL){
	    		Convert2List(root->left,last);
			}
			root->left = last;
			if(last != NULL){
				last->right = root;
			}
			last = root;
			if(root->right != NULL){
				Convert2List(root->right,last);		
			}
		}
};

TreeNode* Create_BinaryTree()
{
    TreeNode* T = new TreeNode(0);
    string s;
    cin>>s;
    if(s == "#"){                                                  //“#”是结束标志 
        T = NULL;
    }else{
        T->val = atoi(s.c_str());                                   //对当前结点初始化 
        T->left = Create_BinaryTree();                             //递归构造左子树 
        T->right = Create_BinaryTree();                            //递归构造右子树 
    }
    return T;
}

int main()
{
	while(true){
		TreeNode* root = Create_BinaryTree();
		Solution s;
		TreeNode* head = s.Convert(root);
		while(head){
			cout<<head->val<<" ";
			head = head->right; 
		}
	}
	
	return 0;
}

你可能感兴趣的:(#,剑指offer题解)