`
mdxdjh2
  • 浏览: 12359 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JAVA 二叉树算法 (遍历、深度、汇总求和)

阅读更多

二叉树构造类:

public class BinaryTree {

	int data; // 根节点数据
	BinaryTree left; // 左子树
	BinaryTree right; // 右子树

	public BinaryTree(int data) // 实例化二叉树类
	{
		this.data = data;
		left = null;
		right = null;
	}

	public void insert(BinaryTree root, int data) { // 向二叉树中插入子节点
		if (data > root.data) // 二叉树的左节点都比根节点小
		{
			if (root.right == null) {
				root.right = new BinaryTree(data);
			} else {
				this.insert(root.right, data);
			}
		} else { // 二叉树的右节点都比根节点大
			if (root.left == null) {
				root.left = new BinaryTree(data);
			} else {
				this.insert(root.left, data);
			}
		}
	}
}

 

二叉树遍历、深度及求和:

public class BinaryTreePreorder {
	
	private static StringBuffer current = new StringBuffer();
    private static int sum = 0;
    private static int needSum = 178;

	public static void preOrder(BinaryTree root) { //前序遍历(递归)
		if (root != null) {
			System.out.print(root.data + "-");
			preOrder(root.left);
			preOrder(root.right);
		}
	}

	public static void inOrder(BinaryTree root) { // 中序遍历

		if (root != null) {
			inOrder(root.left);
			System.out.print(root.data + "--");
			inOrder(root.right);
		}
	}

	public static void postOrder(BinaryTree root) { // 后序遍历

		if (root != null) {
			postOrder(root.left);
			postOrder(root.right);
			System.out.print(root.data + "---");
		}
	}

	public static int getDepth(BinaryTree node) {  //深度
		if (node == null) {
			return 0;
		}
		int leftDepth = 0;
		int rightDepth = 0;
		leftDepth = getDepth(node.left);
		rightDepth = getDepth(node.right);
		return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
	}
	
	public static void visit(BinaryTree p) {  
        System.out.print(p.data + " ");  
    }  
	
	protected static void iterativePreorder(BinaryTree p) {  //前序遍历(非递归)
        Stack<BinaryTree> stack = new Stack<BinaryTree>();  
        if (p != null) {  
            stack.push(p);  
            while (!stack.empty()) {  
                p = stack.pop();  
                visit(p);  
                if (p.right != null)  
                    stack.push(p.right);  
                if (p.left != null)  
                    stack.push(p.left);  
            }  
        }  
    }  
	
	private static void sum(BinaryTree node){    //计算二叉树节点总和数为N的集合,这里N = 178
        int val = node.data;
        current.append(val+",");
        if(node.left==null && node.right==null){ //leaf here
        	sum = 0;
        	String[] nums = current.toString().split(",");
        	for (int i=0;i<nums.length;i++) {
        		sum += Integer.parseInt(nums[i]);
        	}
        	if (sum == needSum) {
        		for (int i=0;i<nums.length;i++) {
            		System.out.print(nums[i]+"-");
            	}
        	}
        }
        else{
            if(node.left!=null){
                sum(node.left);
                current.setLength(current.length()-(node.left.data+"").length()-1);
            }
            if(node.right!=null){
                sum(node.right);
                current.setLength(current.length()-(node.right.data+"").length()-1);
            }
        }
    }
	
	public static void main(String[] str) {
		int[] array = { 12, 76, 35, 22, 16, 48, 90, 46, 9, 40 };
		BinaryTree root = new BinaryTree(array[0]); // 创建二叉树
		for (int i = 1; i < array.length; i++) {
			root.insert(root, array[i]); // 向二叉树中插入数据
		}
		 System.out.println("(递归)前序遍历:");
		 preOrder(root);
		 System.out.println();
		 System.out.println("(非递归)前序遍历:");
		 iterativePreorder(root);
		 System.out.println();
		 System.out.println("中序遍历:");
		 inOrder(root);
		 System.out.println();
		 System.out.println("后序遍历:");
		 postOrder(root);
		 System.out.println();
		 System.out.println("深度:");
		 System.out.println( getDepth(root));
		 System.out.println("遍历求和,取总和为178的序列:");
		 sum(root);
	}
}

 

二叉树图形:



 

  • 大小: 41.6 KB
分享到:
评论

相关推荐

    将满二叉树转化为求和二叉树_二叉树_

    在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...

    「代码随想录」二叉树专题精讲(v2.0).pdf

    深度优先搜索篇:介绍了二叉树的深度优先搜索(DFS)算法,包括前序遍历、中序遍历、后序遍历和路径求和等问题的解法。 广度优先搜索篇:介绍了二叉树的广度优先搜索(BFS)算法,包括层次遍历、锯齿形遍历和最小...

    leetcode338-LeetCode:思路方法。C++/Java/Python

    leetcode 338 个人博客: 坚持每天更新一至两篇。...二叉树中序遍历 Easy 二叉树是否相等 Easy 二叉树最大深度 Easy 二叉树层序遍历 Easy 二叉树是否平衡 Easy 二叉树的最小深度 Easy 二叉树路径和 Easy Pascal三角求和

    BAT算法面试指南(下)1

    【描述】:"目录经典算法Manacher算法原始问题进阶问题BFPRT算法morris遍历二叉树遍历规则先序、中序序列后序序列时间复杂度分析求和为aim的最长子数组长度" 在算法面试中,掌握基础和进阶算法是至关重要的。本篇...

    数据结构二叉树综合实验报告.docx

    《数据结构》实验报告主要探讨了二叉树的相关操作,包括二叉树的遍历算法以及如何计算二叉树的一些基本属性。以下是该实验报告涉及的主要知识点: 1. **二叉树遍历**: - **递归遍历**: - **先序遍历**:根 -&gt; ...

    从算法到数据结构

    《从算法到数据结构》是一份全面的算法和数据结构学习资料汇总,它不仅覆盖了算法的基本概念和常见数据结构的设计原理,还包含了大量实用的编程实例及面试题目解答。这份资源由GitHub用户sherxon维护,其项目地址为...

    关于java算法的电子书

    Java算法是计算机科学中的核心部分,对于任何Java开发者来说,理解和掌握算法都是非常重要的。这本电子书涵盖了Java语言实现的各种算法,旨在帮助读者提升编程能力,优化问题解决策略,并为面试准备提供宝贵资源。 ...

    算法设计 矩阵连乘

    对于两个n×n的矩阵A和B,它们的乘积C是通过将A的每一行与B的每一列对应元素相乘然后求和得到的。如果存在更多的矩阵,例如C和D,我们先计算AB,再用结果乘以D。这个过程的计算量随着矩阵的数量增加而增加,因此优化...

    2011年华中科技大学数据结构与算法分析考研试题1

    题目二是要求遍历二叉树并求和所有值大于0的节点,可采用递归或迭代的方式完成。 总的来说,这份试题全面考察了数据结构与算法的基础知识,包括理论和实践两方面,对考生的理解和应用能力有着较高的要求。

    Second-BiTree.rar_二叉树 计算

    二叉树是一种重要的数据结构,它在计算机科学中扮演着至关重要的角色,特别是在算法和数据存储方面。在“Second-BiTree.rar”压缩包中,包含的“Second-BiTree.cpp”文件很可能是实现二叉树操作的一个C++源代码程序...

    二叉树代码 C语言 17个基本函数 递归 非递归

    以上17个基本操作涵盖了二叉树的主要功能,掌握它们对于理解和实现二叉树算法至关重要。通过C语言编程,我们可以有效地利用递归和非递归策略来实现这些操作。在实际项目中,理解这些基本概念和算法能够帮助开发者...

    Java算法大全(近100种算法打包).zip.zip

    Java算法大全是一个集合了近百种算法的资源包,主要针对Java编程语言,旨在帮助开发者提升在算法设计和实现上的能力。这个压缩包包含了各种类型的算法,涵盖了基础算法到复杂的数据结构处理,对于学习和理解算法有着...

    leetcode买卖股票问题-LeetCode:力码

    leetcode买卖股票问题力码 由 Java 实现的 LeetCode。...二叉树的最小深度 路径和 路径求和 II 将二叉树展平到链表 在每个节点中填充下一个右指针 II 二叉树最大路径和 根到叶数求和 按算法 动态规划

    数据结构习题

    计算Huffman树的WPL时,需遍历所有叶子节点,计算其路径长度并乘以其权重,最后求和得到WPL值。 ### 3. 数组排序 给出一组数字,要求找出正确的排序结果。排序是数据结构中的基本操作之一,常见的排序算法包括冒泡...

    《剑指Offer》Java代码(高清带目录) (1).pdf

    58. 二叉树的下一个节点:涉及二叉树遍历算法以及节点关系的确定。 59. 对称的二叉树:涉及树结构的对称性判断。 60. 按之字形顺序打印二叉树:涉及二叉树的层序遍历以及队列操作。 61. 把二叉树打印成多行:涉及...

    matlab数据结构matlab数据结构

    - **NC5二叉树根节点到叶子节点的路径和**:深度优先搜索遍历,记录路径。 - **BM29二叉树中和为某一值的路径**:递归方法,左右子树分别求和,如果路径和等于目标值,则返回true。 - **NC8二叉树中和为某一值的...

    树与森林的算法认识.ppt

    二叉树的遍历是算法中的重要部分,通常包括前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。此外,线索化二叉树是一种特殊形式的二叉树,通过额外的线索指针使得中序遍历可以在O(1)时间内完成。...

    算法合集解析_275.pdf

    树相关的算法题很多,如重建二叉树、判断二叉树是否为BST(二叉搜索树)、按层遍历二叉树等。二叉树的遍历分为前序、中序、后序,以及层次遍历。对于二叉搜索树,有特定的遍历顺序,如中序遍历得到的结果是有序的。 ...

    数据结构数和二叉树(C/C++)

    2. 深度为k的二叉树最多有2^k-1个节点,这是等比级数求和的结果。 3. 二叉树中,叶节点的数量n0、度为2的非叶节点数量n2和总的节点数n满足公式n = n0 + n2 + 1,这是著名的卡特兰公式。 二叉树在实际应用中非常广泛...

    数据结构与算法知识点必备.pdf

    - 二叉树的定义、遍历方法及其在算法中的应用。 根据上述内容,可以合理推断文档包含了关于数据结构基础、算法基础、栈与队列操作、算法复杂度分析以及树结构的知识点。这份资料可以作为计算机科学学生或相关专业...

Global site tag (gtag.js) - Google Analytics