非递归建立二叉树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非递归建立二叉树相关的知识,希望对你有一定的参考价值。

链栈

//提问的时间很长了 我自己用C++实现了一个 用到了栈
//****************标记建立右子树采取标记
//0左右子树都未建立
//1建立左子树
//2建立右子树
void creatBiTree1(BiTree & tree)

char c;
int flag[20] = 0;
stack<BiTree> stack;
if(cin>>c && c!= '#')

tree = (BiTree)malloc(sizeof(BiTNode));//大根节点
tree->data = c;
stack.push(tree);

else
tree = NULL;
while(!stack.empty())//堆栈不为空

BiTree t = stack.top();
if(cin>>c && c!='#')//伸展

BiTree temp = (BiTree)malloc(sizeof(BiTNode));
temp->data = c;
if(flag[stack.size()]==0)//左子树未建立

t->lchild = temp;
flag[stack.size()]=1;
stack.push(temp);

else //已建立左子树

t->rchild = temp;
flag[stack.size()]=2;
stack.push(temp);


else //回缩

if(flag[stack.size()]==1)

t->rchild = NULL;
flag[stack.size()]=0;
stack.pop();
while(flag[stack.size()]==2 && !stack.empty())

flag[stack.size()]=0;
stack.pop();


else

flag[stack.size()]=1;
t->lchild = NULL;



参考技术A / *建立二进制* /
#包括使用非递归方法“stdio.h中”

#定义最大100

的typedef char数据类型;

typedef结构节点



数据类型的数据;

结构节点* lchild,* rchild;

二叉树;

二叉树* Q [MAX];

二叉树* CREATREE()



字符CH;

整型前,后;

*二叉树的根,* S;

根= NULL;

前= 1;后部= 0;

的printf(“\ t \ t按顺序输入序列\ n中完全二叉树结点号”);

的printf(“\ t \ t请注意:与空结'@'表示进入以'#'结束\\吨\吨序列”);

CH = getchar函数();

而(ch! ='#')



S = NULL;

如果(ch! ='@')

S =(二叉树*)malloc的(的sizeof(二叉树));

S->数据= CH;

S-> lchild = NULL;

S-> rchild = NULL;

后+ +;

Q [后] = S;

如果(后== 1)

根= S;



如果(S && Q [前端])

如果(后部%2 == 0)

Q [前方] - > lchild = S;

Q [前方] - > rchild = S;

如果(后部%2 == 1)前+ +;

CH = getchar函数();

返回根;

无效的主要()



*二叉树树;

树= CREATREE();

的printf(“\ n”);
/ /但是编译器好像有问题VC + +6.0本回答被提问者采纳

超强二叉树解析.必收藏!(数组,链表实现,8种遍历方法,前,中,后序线索化二叉树及其遍历)---风之java

链表实现

先创建一个节点类

public class TreeNode {
    int value;//数据
    TreeNode left;//指向左子树
    TreeNode right;//指向右子树
    public TreeNode(){}
    public TreeNode(int value){
        this.value=value;
        left=null;
        right=null;
    }
}

利用数组建立二叉树

利用递归一一将数组中的数全部存储到二叉树中建立二叉树

   public TreeNode create(char[] arr,int index){
        if(index>=arr.length){
            return null;
        }else{
            TreeNode tmpNode=new TreeNode((int)(arr[index]));
            tmpNode.left=create(arr,2*index);
            tmpNode.right=create(arr,2*index+1);
            return tmpNode;
        }
    }

整体代码实现

```java
public class BinaryTree {
    public TreeNode root;
    public TreeNode(){}
    public BinaryTree(char[] ch,int index){
        root=create(ch,index);
    }
    //将数组表示法转换为链表表示法
    public TreeNode create(char[] arr,int index){
        if(index>=arr.length){
            return null;
        }else{
            TreeNode tmpNode=new TreeNode((int)(arr[index]));
            tmpNode.left=create(arr,2*index);
            tmpNode.right=create(arr,2*index+1);
            return tmpNode;
        }
    }

直接添加元素,建立二叉排序树

    public void add(int data){
        TreeNode newNode=new TreeNode(data);
        //建立树根
        if(root==null){
            root=newNode;
            return;
        }
        TreeNode cur=root;
        while(true){
            if(newNode.value<cur.value){
                if(cur.left==null){
                    cur.left=newNode;
                    return;
                }else{
                    cur=cur.left;
                }
            }else{
                if(cur.right==null){
                    cur.right=newNode;
                    return;
                }else{
                    cur=cur.right;
                }
            }
        }
    }

二叉树的搜索

可以看到二叉树的搜索是建立在二叉排序树的基础上

    //查找该二叉树上是否含有该元素
    public boolean findTreeNode(TreeNode root,int value){
        if(root==null){
            return false;
        }else{
            if(root.value==value){
                return true;
            }else{
                if(value<root.value){
                    count++;
                    return findTreeNode(root.left,value);
                }else{
                    count++;
                    return findTreeNode(root.right,value);
                }
            }
        }
    }

二叉运算树

先创建一个节点类

public class TreeNode {
    int value;
    TreeNode left;
    TreeNode right;
    public TreeNode(){}
    public TreeNode(int data){
        this.value=data;
        left=null;
        right=null;
    }
}

接下来实现二叉运算树

public class BinaryTree {
    public TreeNode root;
    public BinaryTree(char[] ch,int index){
        root=create(ch,index);
    }
    //添加元素
    public void add(int data){
        TreeNode newNode=new TreeNode(data);
        if(root==null){
            root=newNode;
            return;
        }
        TreeNode cur=root;
        while(true){
            if(newNode.value<cur.value){
                if(cur.left==null){
                    cur.left=newNode;
                    return;
                }else {
                    cur=cur.left;
                }
            }else{
                if(cur.right==null){
                    cur.right=newNode;
                    return;
                }else{
                    cur=cur.right;
                }
            }
        }
    }
    //将数组表示法转换为链表表示法
    public TreeNode create(char[] arr,int index){
        if(index>=arr.length){
            return null;
        }else{
            TreeNode tmpNode=new TreeNode((int)(arr[index]));
            tmpNode.left=create(arr,2*index);
            tmpNode.right=create(arr,2*index+1);
            return tmpNode;
        }
    }
    //判断表达式如何运算的方法声明
    public int condition(char ch,int n1,int n2){
        switch(ch){
            case '+': return n1+n2;
            case '-': return n1-n2;
            case '*': return n1*n2;
            case '/': return n1/n2;
            case '%': return n1%n2;
            default: return -1;
        }
    }
    //计算二叉运算树的值
    public int answer(TreeNode root){
        int first=0;
        int second=0;
        if(root.left==null&&root.right==null){
            return Character.getNumericValue((char)root.value);
        }else{
            first=answer(root.left);
            second=answer(root.right);
            return condition((char)root.value,first,second);
        }
    }
    //中序表示法
    public void inOrder(TreeNode root){
        if(root!=null){
            inOrder(root.left);
            System.out.print((char)root.value+" ");
            inOrder(root.right);
        }
    }
    //后序表示法
    public void postOrder(TreeNode root){
        if(root!=null){
            postOrder(root.left);
            postOrder(root.right);
            System.out.print((char)root.value+" ");
        }
    }
    //前序表示法
    public void preOrder(TreeNode root){
        if(root!=null){
            System.out.print((char)root.value+" ");
            preOrder(root.left);
            preOrder(root.right);
        }
    }
}

前序遍历递归实现

//前序遍历
    public void preOrder1(TreeNode root){
        if(root!=null){
            System.out.print(root.value+" ");
            preOrder1(root.left);//遍历左子树
            preOrder1(root.right);//遍历右子树
        }
    }

前序遍历非递归实现

解法一

利用堆栈的性质

 //前序遍历非递归1
    public void preOrder2(TreeNode cur){

        Stack<TreeNode> stack=new Stack<>();
        while(cur!=null||!stack.isEmpty()){
            while(cur!=null){
                stack.add(cur);
                System.out.print(cur.value+" ");
                cur=cur.left;
            }
            cur=stack.pop();
            cur=cur.right;
        }
    }

解法二

将元素按照前序遍历的顺序压入栈中,再依次弹出即可

  //前序遍历非递归2
    public void preOrder3(TreeNode cur){
        Stack<TreeNode> stack=new Stack<>();
        stack.add(cur);
        while(!stack.isEmpty()){
            cur=stack.pop();
            System.out.print(cur.value+" ");
            if(cur.right!=null)
                stack.add(cur.right);
            if(cur.left!=null)
                stack.add(cur.left);
        }
    }

中序遍历递归实现

 //中序遍历
    public void inOrder1(TreeNode root){
        if(root!=null){
            inOrder1(root.left);//处理左子树
            System.out.print(root.value+" ");
            inOrder1(root.right);//处理右子树
        }
    }

中序遍历非递归实现

和前序遍历的非递归实现一样,只不过是交换了打印顺序。

    //中序遍历非递归
    public void inOrder2(TreeNode cur){
        Stack<TreeNode> stack=new Stack<>();
        while(cur!=null||!stack.isEmpty()){
            while(cur!=null){
                stack.add(cur);
                cur=cur.left;
            }
            cur=stack.pop();
            System.out.print(cur.value+" ");
            cur=cur.right;
        }
    }

后序遍历递归实现

 //后序遍历
    public void postOrder1(TreeNode root){
        if(root!=null){
            postOrder1(root.left);//处理左子树
            postOrder1(root.right);//处理右子树
            System.out.print(root.value+" ");
        }
    }

后序遍历非递归实现

后序遍历较为复杂,需要用到栈的性质,且用 cur 来判断打印树叶,用 pre 来记录左或右节点来判断是否打印父节点

    public void postOrder2(TreeNode cur){
        if(cur==null)
            return;

        Stack<TreeNode> stack=new Stack<>();
        TreeNode pre=null;
        stack.add(cur);
        while(!stack.isEmpty()){
            cur=stack.peek();
            if((cur.left==null&&cur.right==null)||(pre!=null&&(pre==cur.left||pre==cur.right))){ 
                System.out.print(cur.value+" ");
                stack.pop();
                pre=cur;
            }else{
                if(cur.right!=null)
                    stack.add(cur.right);
                if(cur.left!=null)
                    stack.add(cur.left);
            }
        }
    }

层序遍历递归实现

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        helper(root, 0, result);
        return result;
    }

    public void helper(TreeNode root, int level, List<List<Integer>> lists) {
        if (root == null) {
            return;
        }
        if (lists.size() < level + 1) {
            lists.add(new ArrayList<Integer>());
        }
        lists.get(level).add(root.val);
        helper(root.left, level + 1, lists);
        helper(root.right, level + 1, lists);以上是关于非递归建立二叉树的主要内容,如果未能解决你的问题,请参考以下文章

重现二叉树非递归算法的构建过程

二叉树非递归遍历

二叉树非递归遍历

二叉树非递归后缀遍历

6)二叉树非递归遍历

非递归创建二叉树存在问题,求指点