晚安杨少 2022-05-30 10:44 采纳率: 33.3%
浏览 85
已结题

数据结构与算法c++,使用类和对象采用成员函数完成算法

以先序和中序构造二叉树,替换所有与pattern匹配的子树为bitree
使用栈的非递归算法,深拷贝
类和对象!
类和对象!
类和对象!

  • 写回答

2条回答 默认 最新

  • 歇歇 2022-06-05 03:05
    关注

    以中根和后根遍历序列构造二叉树,替换所有与pattern匹配的子树为bitree。

    public class BinaryTree
    {
    public BinaryNoderoot;
    public BinaryTree() 
    {
        this.root = null;
    }
    
    public boolean isEmpty() //判断是否是空
    {
        return this.root == null;    
    }
    
    public String toString()//输出带空子树先跟序列
    {
        return toString(this.root);
    }
    public String toString(BinaryNode<T>p)
    {
        if(p==null)
            return "^";
        return p.data.toString()+""+toString(p.left)+toString(p.right);
    }
    
    public BinaryTree(T inlist[],T postlist[])
    {
        this.root=BinaryTreecreate(inlist,0,inlist.length-1,postlist,0,postlist.length-1);
    }
    
    
    //由后根遍历的次序可知,该二叉树的根是potlist[n-1];改节点必定在中根次序中
    //由中根遍历次序可知,Inlist[i]节点前段节点在根的左子树上,inlist[i]后的所有节点在根节点的右子树上
    
    public BinaryNode<T> BinaryTreecreate(T[] inlist, int inbegin, int inend, T[] postlist, int postbegin, int postend)
    {
        
         if (postbegin < 0 || inbegin > inend)  //递归结束条件
                return null;
            BinaryNode<T> p = new BinaryNode<T>(postlist[postend]);
            int j = inbegin;  //标记查找到的根结点的位置
            while (j <= inend&&inlist[j] != postlist[postend]) {  //遍历查找
                j++; 
            }
            p.left = BinaryTreecreate(inlist, inbegin, j - 1, postlist, postbegin, postbegin + j - inbegin - 1);  //递归构造左子树
            p.right = BinaryTreecreate(inlist, j + 1, inend, postlist, postbegin + j - inbegin, postend - 1);  递归构造右子树
            return p;
    }
    
    
    
    public BinaryTree(T[] prelist)//构造二叉树,prelist数组指定二叉树标明空子树的先根遍历序列
    {
        this.root=create(prelist);
    }
    //以从i开始的标明空子树的先根序列,创建一颗以prelist[i]为根的子树,返回根结点,递归方法
    private int i=0;
    private BinaryNode<T>create(T[] prelist) 
    {
        BinaryNode<T>p=null;
        if(i<prelist.length)
        {
            T elem=prelist[i];
            i++;
            if(elem!=null)                    //不能elem!="kong",因为T不一定是String
            {
                p=new BinaryNode<T>(elem);   //创建叶子结点
                p.left=create(prelist);      //创建P的左子树,递归调用
                p.right=create(prelist);     //创建P的右子树,递归调用
            }
        }
        return p;
    }
    
    
    //比较
    public boolean equals(BinaryNode<T> p,BinaryNode<T> q)
    {
        return (p==null&&q==null)||(p!=null&&q!=null)&&(q.data.equals(p.data))&& equals(p.left,q.left)&&equals(p.right,q.right);
    }
    
    //对象复制
     BinaryTree(BinaryTree<T> bitree)  //实现BinaryTree<T>二叉树类声明的深拷贝构造方法
        {
            this.root = copy(bitree.root);
        }
    
        private BinaryNode<T> copy(BinaryNode<T> p)  //方法实现   
        {
            BinaryNode<T> q = null;
            if (p != null) {
                q = new BinaryNode<T>(p.data);
                q.left = copy(p.left);
                q.right = copy(p.right);
            }
            return q;
        }
        
        
    
        public void replaceAll(BinaryTree<T> pattern, BinaryTree<T> bitree)
        {
            if(equals(pattern))
                this.root=this.copy(bitree.root);
            else
                this.replaceall(this.root,pattern.root,bitree.root);                       //可不写
        }
    
    
        public void replaceall(BinaryNode<T> p,BinaryNode<T> pattern,BinaryNode<T> bitree)
        //p指向this的结点;pattern指向pattern的结点;bitree指向bitree的结点;q指向
        {
            //优先遍历的非递归算法 P154
            LinkedStack<BinaryNode<T>>stack=new LinkedStack<BinaryNode<T>>();//创建的这个空栈为链式栈,使用单链表存储数据且实现栈接口  P91
            BinaryNode<T> q=null;  //q标记P的根结点
            while(p!=null||!stack.isEmpty())//P非空或栈非空时
            {
                if( p!= null)
                {
                    if(this.equals(p, pattern)) //以p为根结点的子树,以pattern为根结点的子树
                    {
                        if(p==q.left ) //如果p与p的根结点的左子树相等
                        { q.left=this.copy(bitree);
                        p=null;}  //p置空
                        else
                    { q.right=this.copy(bitree);
                        p=null;}
                    }
               
                else
                {
                    stack.push(p);
                    q=p;
                    p=p.left;
                }
           }
            else
            {
                p = stack.pop();
                q=p;
                p = p.right;
            }
       }
     }
    
    
    public static void main(String args[])
    {
            String[] parent={"A","D","D",null,"G",null,null,"D",null,"G",null,null,"C","E",null,null,"F","H",null,null,"D",null,"G"};
            
            String[] inlist={"D","G","B","A","E","C","H","F"};  //中根次序
            String[] postlist={"G","D","B","E","H","F","C","A"};  //后根次序
            
            String[] pattern1={"D",null,"G"};
            
            String[] bitree1={"M","D",null,"G"};
           
            BinaryTree<String> values=new BinaryTree<String>(parent);
            BinaryTree<String> pattern=new BinaryTree<String>(pattern1);
            BinaryTree<String> bitree=new BinaryTree<String>(bitree1);
    
            BinaryTree<String> tree=new BinaryTree<String>(inlist,postlist);
            System.out.println("构造出来的二叉树以先根次序输出为:"+values.toString());
            
            System.out.println("中根后根构造: "+tree.toString()); 
            System.out.println("pattern序列: "+pattern.toString());
            System.out.println("bitree序列: "+bitree.toString());
            
            values.replaceAll(pattern,bitree);  //替换
            System.out.println("替换后树values的序列: "+values.toString());  //输出替换后树values的序列
    
    }
    
    评论

报告相同问题?

问题事件

  • 系统已结题 6月7日
  • 创建了问题 5月30日

悬赏问题

  • ¥50 求一位精通京东相关开发的专家
  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多