一.思维导图二.概念笔记树的存储结构双亲表示法:当算法中需要在树结构中频繁地查找某结点的父结点时,使用双亲表示法最合适
孩子表示法:适用于查找某结点的孩子结点
孩子兄弟表示法:可以用孩子兄弟表示法将普通树转化为二叉树二叉树的性质性质一: 在二叉树的第k层上最多有2^(k-1)个结点
性质二: 高度为k的二叉树至多有2^k-1个结点,最少有k个结点
性质三: 对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2 + ...
二叉树的深度遍历用递归的话就没有什么好说的了。代码实现/*** 源码名称:TreeIteratorRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历 * 版权:CopyRight@A2BGeek * 作者:A2BGeek*/
public class TreeIteratorRecursion {class TreeNode<T> {private T mNodeData;private TreeNode<T> mLeftChild;private TreeNode<T> mRightChild;public TreeNode(T data, TreeNode<T> left, TreeNode<T> right) {// TODO Auto-g...
接着上一个二叉树的主题,用python写一下求二叉树深度和宽度的代码,求深度用递归;求宽度用队列,然后把每层的宽度求出来,找出最大的就是二叉树的宽度,如下:import queueclass Node:def __init__(self,value=None,left=None,right=None):self.value=valueself.left=leftself.right=rightdef treeDepth(tree):if tree==None:return 0leftDepth=treeDepth(tree.left)rightDepth=treeDepth(tree.right)if leftDepth>rightDepth:re...
1.二叉树的非递归中序遍历算法二叉树的中序遍历方法是:左中右,因此一开始会顺着根节点的左孩子一直往下(这点和先序遍历一样,这也是二者前面部分代码很相似的原因),到最后一个左孩子时尝试把它的右孩子塞进栈内,然后顺着它的的左孩子而下,直到不能访问为止。利用的栈FILO的特性,对每个节点都进行顺左孩子而下即可。上代码: 1void inOrder(TreeNode* root,vector<int>& inOrder)2 {3 stack<TreeNode*>st;4 TreeNo...
首先来递归算法,简单易懂:#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef struct TreeNode{char data;struct TreeNode *lchild, *rchild;
}TreeNode;void PreOrderTraverse(TreeNode *t){if( NULL == t ) return;printf("%c",t->data);PreOrderTraverse(t->lchild);PreOrderTraverse(t->rchild);
} 然后是栈模拟递归:typedef struct StackNode{TreeNode *pdata;struct StackNode *next;
}StackNode;
t...
目录Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层序遍历TagBinary Tree Zigzag Level Order Traversal 二叉树的锯齿形层序遍历给一个二叉树的root,返回其节点值从上到下遍历,奇数层从左到右 遍历,偶数层从右到左。Input: root = [3,9,20,null,null,15,7]
Output: [[3],[20,9],[15,7]]
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right...
二叉树遍历算法的改进二叉树的深度优先遍历算法都是用递归函数实现的,这是很低效的,原因在于系统帮你调用了一个栈并做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以用非常简洁的代码实现。二叉树深度优先遍历算法的非递归实现用用户定义的栈来代替系统栈,也就是用非递归的方式来实现遍历算法,可以得到不小的效率提升。二叉树深度优先遍历算法的非递归实现(1)先序遍历非递归算法要写出其遍历的非递归算法,其主要任务...
有两种通用的遍历树的策略: 深度优先搜索(DFS) 在这个策略中,我们采用深度作为优先级,以便从跟开始一直到达某个确定的叶子,然后再返回根到达另一个分支。 深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为前序遍历,中序遍历和后序遍历。 宽度优先搜索(BFS) 我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。作者:LeetCode链接:https://leetcode-c...
题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小。学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点虽然紫书的思路很清晰= =可是理解起来好困难啊啊啊啊后来终于问懂一丢丢了---比如说样例:中序遍历:3 2 1 4 5 7 6后序遍历:3 1 2 5 6 7 4首先做第一层: 在后序遍历中的最后一个数为根节点,然后在到中序遍历中找到这个根节点,在这个根节点的左边是左子树,右边是...
闲来无事,重看了《数据结构》一书,突然发现其中的很多代码写的很精妙,以下就是我对二叉树一部分的做的记录。一般遍历就是使用前序、中序、后序三种遍历,我自己平时都是使用递归算法,今天看书才发现递归算法不是最优解,因为函数调用栈层层叠加,还要保存函数的返回地址,实际参数传递,创建局部变量等等。 一、二叉树前序非递归算法 前序遍历的特点是:首先访问根,访问完根后再访问左子树,所以对每一个结点,在访...
1、二叉树的三种遍历方式二叉树有三种遍历方式:先序遍历,中序遍历,后续遍历 即:先中后指的是访问根节点的顺序 eg:先序 根左右 中序 左根右 后序 左右根 遍历总体思路:将树分成最小的子树,然后按照顺序输出 1.1 先序遍历 a 先访问根节点 b 访问左节点 c 访问右节点 a(b ( d ( h ) )( e ( i ) ))( c ( f )( g )) -- abdheicfg 1.2 中序遍历 ...
二叉树的遍历是二叉树的众多算法的基础。主要有,前序,中序与后序。对于以下二叉树:前序:12354中序:21543后序:24531笔者实现了三种遍历方式:1 前序:递归版本比较简单,只需要改变push_back操作的位置即可。vector<int> PreOrderTraverse2(TreeNode *root)
{vector<int> nodes;vector<int> temp;if(root == NULL) return nodes;nodes.push_back(root->val);temp = PreOrderTraverse2(root->left);for(vector<int>::size_type...
1// 树结点定义2 typedef struct TNode
3{
4int value;
5 TNode *left;
6 TNode *right;
7 }*PTNode;1. 前序遍历的非递归实现(借鉴递归思想实现)思想:访问到一结点时,先将其入栈,假设入栈节点为P。访问P,将P的右孩子和左孩子依次入栈,这样就保证了每次左孩子在右孩子前面被访问。 1void preOrderNoneRecursion(PTNode root)2{3if(root == NULL)4return;5 PTNode p = root;6 stack<PTNode> nodeStack;7 n...
//==================================================================
// 《剑指Offer——名企面试官精讲典型编程题》代码
// 作者:何海涛
//==================================================================// 面试题7:重建二叉树
// 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输
// 入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,
// 2, 4, 7, 3, 5, 6, 8}和中...
一、定义二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。二、性质 在非空二叉树中,第i层的结点总数不超过, i>=1; 深度为h的二叉树最多有个结点(h>=1),最少有h个结点; 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1; 具有n个结点的完全二叉树的深度为(注:[ ]表示向下取整)有N个...