以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 计算机考研交流 』   (http://bbs.xml.org.cn/list.asp?boardid=67)
----  ds算法讨论  (http://bbs.xml.org.cn/dispbbs.asp?boardid=67&rootid=&id=37266)


--  作者:Supremgoooo
--  发布时间:8/27/2006 9:10:00 PM

--  ds算法讨论
(1)穿线数:前序,中序,后序及其分别特有的性质

(2)loser tree的其它建树(实现)方法

(3)bbst(最佳bst)的建树方法

imho:大题。。。。。


--  作者:Supremgoooo
--  发布时间:8/28/2006 1:07:00 PM

--  
我利用mxf3306的二叉树后序周游框架,写了个穿线树建树的一般算法:

void Thread(ThreadNode *root)
{
    ThreadNode *pre=NULL;
    StackNode *e=new StackNode;
    e.pointer=root;
    using std::stack;
    stack<StackNode> s;
    while(!s.empty()||e.pointer)
    {
         if(e.pointer)
         {
               ThreadVisit(e.pointer,pre);   //pre
               e.tag=left;
               s.push(e);
               e.pointer=e.pointer->lc;
          }
         else
         {
               e=s.top;   s.pop();
               if(e.tag==left)
               {
                      ThreadVisit(e.pointer,pre);   //In
                      e.tag=right;
                      s.push(e);
                      e.pointer=e.pointer->rc;
               }
               else
               {
                       ThreadVisit(e.pointer,pre);   //Post
                       e.pointer=NULL;
               }
         }
     }
}

void ThreadVisit(ThreadNode *e.pointer,ThreadNode *pre)
{
     visit(e.pointer->value());
     if(pre!=NULL&&pre->rc==NULL)
     {
           pre->rt=1;
           pre->rc=e.pointer;
     }
     if(pre!=NULL&&e.pointer->lc==NULL)
     {
           e.pointer->lt=1;
           e.pointer->lc=pre;
     }
     pre=e.pointer;
}


--  作者:Supremgoooo
--  发布时间:8/28/2006 1:14:00 PM

--  
问题:可否找到穿线树不用递归,不用stack的统一遍历方法??
--  作者:Supremgoooo
--  发布时间:8/29/2006 8:50:00 PM

--  
呵呵,想了一下,是不行的。因为后序穿线不能找某节点的后序后继。

我总结的穿线树性质:
(1)中序:可找中序前驱,中序后继,前序后继,后序前驱;
(2)后序:可找后序前驱;
(3)前序:可找前序后继;
欢迎大家补充!


--  作者:Supremgoooo
--  发布时间:9/9/2006 10:27:00 PM

--  
对BBST,知道了r数组是可以把它建出来的,求建树的方法。
--  作者:Supremgoooo
--  发布时间:9/10/2006 7:45:00 PM

--  
其实这是个很简单的问题,由BST的性质和r数组的定义,可以得到一个明显的结论:
r数组中相邻的节点间是父子关系。

所以算法是很简单的:
Node* Build_OBST(int **r,int n)
{
      for(int i=0;i+2<=n;i++)
      {
            if(r[i][i+2]==i+1)
               SetParent(i+1,i+2);  //将i+1作为i+2的父亲
           else   SetParent(i+2,i+1);
      }
      Node *root=Address(r[0][n]); //r[0][n]是归并n个节点后的根
     return root;
}


--  作者:teng_t1986
--  发布时间:9/15/2006 6:35:00 PM

--  
最后一个,动态规划典型问题,怎么觉得你的算法有点不对啊?连起码的权值比较都没有??可以给个完整的吗?
--  作者:Supremgoooo
--  发布时间:9/18/2006 10:11:00 PM

--  
恩,有反例的,我想的简化方法不对。期待某大侠给个完整算法!

提示:从下到上,用等价类合并;从上到下,用回溯。


--  作者:springy126
--  发布时间:9/20/2006 1:06:00 PM

--  
通用的方法都有些复杂,
这样是不是更简单:
while(!s.empty()||e.pointer)
    {
         if(e.pointer)
         {
              e.pointer=e.pointer->lc;

              s.push(e);
          }
         else
         {
               e=s.top;

               s.pop();
               ThreadVisit(e.pointer,pre);
               e.pointer=e.pointer->rc;
         }
     }

其他和Supremgoooo 相同,请各位指教


--  作者:teng_t1986
--  发布时间:9/22/2006 6:16:00 PM

--  
用动态规划的典型加速算法呀……最后应该是O(n^2)的时间代价……具体算法书上有,不过是O(n^3)……
--  作者:Supremgoooo
--  发布时间:9/22/2006 11:08:00 PM

--  
哪本书上有?贴出来看一下吗!

这个算法我想了很长时间了,感觉是只可意会不可言传的算法。实际写出来太难了。。。


--  作者:borlong
--  发布时间:9/25/2006 4:49:00 PM

--  
问题:可否找到穿线树不用递归,不用stack的统一遍历方法??

Answers:不行!因为构造穿线树时候,事实上是对树的一种遍历,而树本身就是非线性的!可是穿线树结果是让其具有线性特征!将非线性转化为线性,必须要有种“暂时的存储器”用来过渡,这就是栈存在的意义!即用此结构来调节、缓冲数据的顺序!


--  作者:zxcvbnm647
--  发布时间:11/2/2006 9:07:00 PM

--  

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
85.938ms