首页 > 其他分享 >用递归和非递归两种方式实现二叉树的先序遍历(前序遍历)

用递归和非递归两种方式实现二叉树的先序遍历(前序遍历)

时间:2023-09-04 15:34:14浏览次数:36  
标签:Node head 遍历 递归 前序 value public stack

一、分析

先序遍历(前序遍历)遍历顺序为:根、左、右。

二、递归实现

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

public void preOrderRecur(Node head){
	if(head == null){
  	return;
  }
  c
  preOrderRecur(head.left);
  preOrderRecur(head.right);
}

三、非递归实现

3.1 问题分析

用递归方法解决的问题都能用非递归方法实现,这是因为递归方法无非就是利用函数栈来保存信息,如果用自己申请的数据结构来代替函数栈,也可以实现相同的功能。

用递归方式实现二叉树的前序遍历过程如下:

1、申请一个新的栈,记为stack。然后将头节点head压入stack中。

2、从stack中弹出栈顶节点,记为cur,然后打印cur节点的值,再将cur的右子节点(不为空的话)压入栈中,最后将cur的左子节点(不为空的话)压入stack中。

3、不断重复步骤2,直到stack为空,全部过程结束。

代码如下:

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

public void preOrderunRecur(Node head){
	if(head != null){
  	System.out.println(head.value + " ");
    Stack<Node> stack = new Stack<Node>;
    stack.add(head);
    while(!stack.isEmpty()){
    		head = stack.pop();
        System.out.println(head.value + " ");
        if(head.right != null){
        	stack.push(head.right);
        }
        if(head.left != null){
        	stack.push(head.left);
        }
    }
  }
  System.out.println();
}

标签:Node,head,遍历,递归,前序,value,public,stack
From: https://blog.51cto.com/u_16244372/7351134

相关文章

  • HashMap遍历方式
    HashMap是一个键值对的集合,我们不能通过简单的循环来遍历HashMap,所以我们一般通过以下两种方式来遍历HashMap,一种是通过KeySet集合来遍历,另一种是通过entry键值对对象来遍历。KeySet遍历HashMap通过keySet()方法获取HashMap的keySet集合遍历keySet集合,可以使用iterator迭代器或......
  • vue 组件递归显示,递归组件中事件传值问题。
    1、比如下面的结构[{id:1,text:'1',children:{id:2,text:'2',children:{id:3,text:'3'......}}]可以看到,每个节点下面的children都是不一定的,有的可能会有很多层,有的可能只有一层。......
  • 汉诺塔问题C语言递归
    (汉诺塔问题C语言递归)什么是汉诺塔问题汉诺塔问题是一个经典的问题。汉诺塔(HanoiTower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另......
  • 遍历技巧
    菜鸟教程:https://www.runoob.com/python3/python3-data-structure.html链接  1#在字典中遍历时,关键字和对应的值可以使用items()方法同时解读出来:2knights={'gallahad':'thepure','robin':'thebrave'}3fork,vinknights.items():4......
  • 递归乘法表
    #include<bits/stdc++.h>usingnamespacestd;voidno(inta,intb){ if(b<=9){ if(a<=b){ cout<<a<<"*"<<b<<"="<<a*b<<""; no(a+1,b); }else{ cout<<endl; no(1,b+1); } ......
  • 递归九九乘法表
    #include<iostream>usingnamespacestd;voidshow(inta,intb){ if(b<=9){ if(a<=b){ cout<<a<<"x"<<b<<"="<<a*b<<""; show(a+1,b); } cout<<endl; } show(1,b+1......
  • 递归 99乘法表
    1#include<iostream>2usingnamespacestd;3voidcheng(inta,intb){4if(a<=9){5if(b<=a){6cout<<a<<"x"<<b<<"="<<a*b<<"";7ch......
  • 九九乘法表(递归)
    #include<iostream>usingnamespacestd;voidf(inta,intb){ if(b<=9){ if(a<=b){ cout<<a<<"x"<<b<<"="<<a*b<<""; f(a+1,b); } cout<<endl; } f(1,b+1);}int......
  • 递归函数
    递归就是在函数内部调用自身。其实递归在很大程度上牺牲了空间换取了可读性。每次调用递归函数的时候都会创建一个函数栈,如果递归深度过大,则会造成溢出状况。原文中使用a,b=b,a+b方法求斐波那契数列,占用空间少,来回只有两个变量的空间占用,很方便。 斐波那契数列如果用递归方......
  • Vue+Elemnt-UI遍历生成form-item并为其绑定校验规则
    需求:接口获取数据,动态渲染表单(文本框类型,内容,标签,是否必填)参照博主:blog.csdn.net/qq_33769914/article/details/122449601遇到的问题:1.通过对单个item绑定的校验规则不生效(表现为:不弹提示,或填了内容依旧提示)           2.提示出现后通过clearValidate()......