算法题——二叉树转换为左单链表

题目:给定一棵二叉树,将所有的结点都放到左儿子的位置,即除了root结点外,每一个结点都是其他某一个结点的左儿子。不用保持某种顺序,不能递归,O(1)空间。

 

思路

我的想法是,维持一个遍历指针p,另一个指针tail永远指向向左遍历到底的结点;

初始化p和tail都为root,开始循环:

  • 如果p为叶子结点,则退出循环;
  • 如果p没有右儿子,则向左下降一层;
  • 如果p有右儿子,则tail向左遍历到底,将p的右子树挂到tail的左儿子上,p右儿子赋空值,然后向左下降一层。

 

p每次下降一层时,tail从上一个底层结点向左遍历到新底层结点,遍历的结点树为树高O(lg N);p共下降了N层,时间复杂度为O(N * lgN)。

 

代码:

 1 TreeNode *btree2LeftList(TreeNode *root)  2 {  3     if(root == NULL)  4         return root;  5 
 6     TreeNode *p = root, *tail = root;  //p遍历,tail向左遍历到底
 7 
 8     while(p->left != NULL || p->right != NULL)   //p为叶子时退出循环
 9  { 10         if(p->right != NULL) 11  { 12             while(tail->left != NULL)   //p有右子树,则tail向左遍历到底,将p的右子树挂到tail左儿子
13  { 14                 tail = tail->left; 15  } 16             tail->left = p->right; 17             p->right = NULL; 18  } 19         p = p->left; 20  } 21 
22     return root; 23 }

 

    原文作者:阿杰的专栏
    原文地址: https://www.cnblogs.com/qieerbushejinshikelou/p/3917507.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞