算法题:用二叉树构造双向链表

#include <iostream>
#include <string.h>
using namespace std;
struct Node
{
    Node *left;//相当于双向链表的prev指针。
    Node *right;//相当于双向链表的next指针。
    char data;
    Node(char d = char()):data(d),left(NULL),right(NULL){}
};

class MTree
{
    public:
    MTree():root(NULL){}
    void Create_Tree(char *VLR,char *LVR)
    {
        int n = strlen(LVR);
        Create_Tree(root,VLR,LVR,n);
    }
    void Create_Tree(Node *&t,char *VLR,char *LVR,int n)
    {
        //构造二叉树。
        if(n==0)return ;
        int i = 0;
        while(VLR[0]!=LVR[i])i++;
        t = new Node(VLR[0]);
        Create_Tree(t->left,VLR+1,LVR,i);
        Create_Tree(t->right,VLR+i+1,LVR+i+1,n-i-1);
    }
    void Create_DList(MTree &mt)
    {
        Node *pr = NULL;
        Create_DList(root,pr,mt.root);
    }
    static void Printf(MTree &mt)
    {//双向链表打印。
       Node *p = mt.root;
       while(p!=NULL)
        {
          cout<<p->data<<" ";
          p=p->right;
                }
    }
    private:
    void Create_DList(Node *t,Node *&pr,Node *&mt)
    {
        //构造双向链表。
      if(t==NULL)
            {
        return ;
        }
        Create_DList(t->left,pr,mt);
        if(t!=NULL)
         {
        t->left=pr;
        if(pr)
        pr->right = t;
        if(pr==NULL)mt=t;
         }
        if(pr!=NULL && pr->right==NULL)
         {
               pr->right=t;
           t->left = pr;
             }
         pr = t;
         Create_DList(t->right,pr,mt);
    }

    private:
    Node *root;
};
int main()
{
    char VLR[]="ABCDEFG";
    char LVR[]="CBDAFEG";

    MTree mt;
    mt.Create_Tree(VLR,LVR);
    MTree mtlist;
    mt.Create_DList(mtlist);
    MTree :: Printf(mtlist);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 23:41:23

算法题:用二叉树构造双向链表的相关文章

算法题:二叉树的构造

#include <iostream> using namespace std; template<typename Type> struct Node { Node<Type> *right; Node<Type> *left; Type data; Node(Type d = Type()) :data(d), right(NULL), left(NULL){} }; template<typename Type> class MyTree

[算法题] 重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目思路 本题就是按照建立二叉树的思路建立就行了.先序遍历的第一个是根节点,然后在中序遍历找到该根节点,以此为界,中序遍历的左边是它的左子树的中序遍历,同样地找到该左子树在先序遍历中对应的先序遍历顺序.对于右子树也是一样的方法. 本体采用递归,递归就要先写出终止条件. Python代码 这个题目用Python非常方便,因为可以直接利用到Python中的切片技术,省时省力通俗

算法题---创建二叉树及测试程序时的输入方法

创建二叉树的算法中,字符串的输入必须是按先序次序输入,先序遍历二叉树时空树以#代替,以图1-1为例,应该输入的字符串顺序为:ABE##F##CG###(最后一个#是结束符),"#"表示空树,如下图所示: void CreateBiTree(BiTree &T) { char ch; cin >> ch; if (ch == '#') {T = NULL;} else { T = (Node*)malloc(sizeof(Node)); T->data = ch

算法题——二叉树转换为双向链表

1 BSTreeNode* ConvertNode(BSTreeNode* pNode, bool asRight) 2 { 3 if(!pNode) 4 return NULL; 5 6 BSTreeNode *pLeft = NULL; 7 BSTreeNode *pRight = NULL; 8 9 // Convert the left sub-tree 10 if(pNode->m_pLeft) 11 pLeft = ConvertNode(pNode->m_pLeft, false

笔试算法题(09):查找指定和值的两个数 &amp; 构造BST镜像树

出题:输入一个已经升序排序的数组和一个数字:要求在数组中查找两个数,这两个数的和正好等于输入的那个数字,输出任意一对数字就可以,要求时间复杂度是O(n): 分析:对于升序排序的数组{-i-j-k-m--},只有可能是i+m=j+k(j和k可能是同一个数),所以可以从两边往中间收缩而忽视其他交叉相加的情况: 解题: 1 void FindSumFactor(int *array, int length, int sum) { 2 int left=0, right=length-1; 3 whil

笔试算法题(24):找出出现次数超过一半的元素 &amp; 二叉树最近公共父节点

出题:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字: 分析: 解法1:首先对数组进行排序,时间复杂度为O(NlogN),由于有一个数字出现次数超过了数组的一半,所以如果二分数组的话,划分元素肯定就是这个数字: 解法2:首先创建1/2数组大小的Hash Table(哈希表可以替代排序时间,由于一个数字出现超过了数组的一半,所以不同元素个数肯定不大于数组的一半),空间复杂度O(N),顺序扫描映射数 组元素到Hash Table中并计数,最后顺序扫描Hash Table,计数超过数组

笔试算法题(06):最大连续子数组和 &amp; 二叉树路径和值

出题:预先输入一个整型数组,数组中有正数也有负数:数组中连续一个或者多个整数组成一个子数组,每个子数组有一个和:求所有子数组中和的最大值,要求时间复杂度O(n): 分析: 时间复杂度为线性表明只允许一遍扫描,当然如果最终的最大值为0表明所有元素都是负数,可以用线性时间O(N)查找最大的元素.具体算法策略请见代码和注释: 子数组的起始元素肯定是非负数,如果添加的元素为正数则记录最大和值并且继续添加:如果添加的元素为负数,则判断新的和是否大于0,如果小于0则以下一个元素作为起始元素重新开始,如果大于

笔试算法题(41):线索二叉树(Threaded Binary Tree)

出题:线索二叉树(Threaded Binary Tree) 分析: 为除第一个节点外的每个节点添加一个指向其前驱节点的指针,为除最后一个节点外的每个节点添加一个指向其后续节点的指针,通过这些额外的指针可以某种遍历方式对二叉树进行遍历,而加了这些额外指针的二叉树就是线索二叉树: 对于含有N个节点的二叉树而言,一共有2N个指针,但除了根节点的其他节点都有来自其父节点的指针,所以耗用了N-1个指针,则最终剩下2N-(N- 1)=N+1个空指针:线索二叉树就是利用这些空指针存储具有某种遍历顺序的前驱和

笔试算法题(37):二叉树的层序遍历 &amp; 最长递增的数字串

出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b  c d  e  f  g h  i  分析: 原始的层序遍历类似于BFS,打印当前访问的节点curNode的序列号,并将其直接子节点放入队列queue中,然后从queue中取出下一个节点,直 到队列为空:此方法仅能按照层序打印所有节点,并不能区分每一层节点的数量:如果需要区分当前层次的节点,和当前层次节点的子节点,可以使用两个队列 que