将二叉树转换为堆栈而不重复

时间:2018-02-06 20:04:28

标签: java algorithm recursion stack binary-tree

我有一个对象类型的二叉树InfoTree对象有2个属性 - 数字和字符,但有些字符可以重复自己。我的最终目标是找到具有最大数字的字符并返回它的对象&# 39;性格。 为此,我有一个函数来找到最大数字和递归返回,但我仍然需要将数字与二进制树中的字符匹配,所以我想将树转换为只包含字符但没有重复的堆栈这里是我的地方问题。我的不同角色是:k,e,c,d但是我所做的是将堆栈更改为[k,d,c] - 没有e,基本上没有工作。

//input : The function gets a stack and a character
//output : The function returns true if the character given is in the stack
public static boolean isInStack(Stack<Character> s,char ch){
    while(!s.isEmpty()){
        if(s.pop()==ch)
            return true;
    }
    return false;
}

 //The function puts all different characters in a stack
public static void stack(BinTreeNode<InfoTree> t,Stack<Character> s){
    s.push(t.getValue().getTav());
    if(t!=null){
        if(t.getLeft()!=null&&t.getRight()!=null){
            if(!isInStack(s,t.getValue().getTav())){
                s.push(t.getValue().getTav());
            }
            stack(t.getLeft(),s);
            stack(t.getRight(),s);
        }
        else if(t.getLeft()!=null)
        {
            if(!isInStack(s,t.getValue().getTav())){
                s.push(t.getValue().getTav());
            }
            stack(t.getLeft(),s);
        }
        else if(t.getRight()!=null)
        {
            if(!isInStack(s,t.getValue().getTav())){
                s.push(t.getValue().getTav());
            }
            stack(t.getRight(),s);
        }
    }
}

树是:

//input : none
//output : The function builds  and returns a tree
public static BinTreeNode<InfoTree> buildtree(){
    BinTreeNode<InfoTree> t1=new BinTreeNode<InfoTree>(new BinTreeNode<InfoTree>(new InfoTree('k',1)),new InfoTree('k',3),new BinTreeNode<InfoTree>(new InfoTree('k',0)));
    t1.getLeft().setLeft(new BinTreeNode<InfoTree>(new InfoTree('k',0)));
    t1.getLeft().setRight(new BinTreeNode<InfoTree>(new InfoTree('k',0)));
    t1.getLeft().getRight().setLeft(new BinTreeNode<InfoTree>(new InfoTree('e',0)));
    t1.getLeft().getRight().getLeft().setRight(new BinTreeNode<InfoTree>(new InfoTree('d',0)));

    t1.getRight().setLeft(new BinTreeNode<InfoTree>(new InfoTree('c',1)));  
    t1.getRight().getLeft().setRight(new BinTreeNode<InfoTree>(new InfoTree('c',0)));
    return t1;
}

我真的很感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

堆栈是用于收集集合的可怕数据结构。想象一下你有一个包含元素A,B,C的堆栈,其中A是堆栈的顶部,在你的代码中你有另一个C.你的代码将在弹出所有元素后停止并返回元素在那里的true ,但你的堆栈现在将包含零元素。那是结果树的最后一个节点吗?运行后你有4个元素中的3个是分享运气。

正确的数据结构是Set:

Set<Character> setA = new HashSet<Character>();
setA.add('a');
setA.add('a');
setA.add('b');
setA.add('b');
setA.contains('a'); // ==> true
Character[] result = setA.toArray(new Character[setA.size()]);

基本上,您不需要检查是否已经添加它,因为它会处理它。最后,你将拥有独特的字符。