输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
方法一:非递归版 解题思路: 1 .核心是中序遍历的非递归算法。 2 .修改当前遍历节点与前一遍历节点的指针指向。 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; stack<TreeNode*> sta; TreeNode* p = pRootOfTree; TreeNode* pre = NULL,*root;// pre用于保存中序遍历序列的上一节点 bool isFirst = true; while(p!=NULL||!sta.empty()){ while(p!=NULL){ sta.push(p); p = p->left; } p = sta.top(); sta.pop(); if(isFirst){ root = p;// 将中序遍历序列中的第一个节点记为root pre = root; isFirst = false; } else{ pre->right = p; p->left = pre; pre = p; } p = p->right; } return root; } }; 方法二:递归版 解题思路: 1 .将左子树构造成双链表,并返回链表头节点。 2 .定位至左子树双链表最后一个节点。 3 .如果左子树链表不为空的话,将当前root追加到左子树链表。 4 .将右子树构造成双链表,并返回链表头节点。 5 .如果右子树链表不为空的话,将该链表追加到root节点之后。 6 .根据左子树链表是否为空确定返回的节点。 public TreeNode Convert(TreeNode root) { if(root==null) return null; if(root.left==null&&root.right==null) return root; // 1.将左子树构造成双链表,并返回链表头节点 TreeNode left = Convert(root.left); TreeNode p = left; // 2.定位至左子树双链表最后一个节点 while(p!=null&&p.right!=null){ p = p.right; } // 3.如果左子树链表不为空的话,将当前root追加到左子树链表 if(left!=null){ p.right = root; root.left = p; } // 4.将右子树构造成双链表,并返回链表头节点 TreeNode right = Convert(root.right); // 5.如果右子树链表不为空的话,将该链表追加到root节点之后 if(right!=null){ right.left = root; root.right = right; } return left!=null?left:root; }