数据结构和算法系列一

数据结构和算法

通过一些真实的算法题目,来不断学习计算机的基础知识。希望可以对一些常见的数据结构和算法在一大段时间之后,可以有清醒的认识和理解;而不再遇到问题时,总是抓瞎。

在整个算法的学习过程中会使用Go语言来进行编码,会省略package的定义及导入。

接下来会是两道关于二叉树的算法题目,主要用到的数据结构是包含树节点的结构体,用到的算法思想是递归。

二叉树的算法题

首先是下面题目解答中会用到的代表二叉树节点的数据结构:

//Definitionforabinarytreenode.

typeTreeNodestruct{

Valint

Left*TreeNode

Right*TreeNode

}

反转二叉树

第一个算法题目是反转二叉树,也即将类似下面的二叉树的左右节点进行互换:

//Invertabinarytree.

//

//4

///\

//27

///\/\

//

//to

//4

///\

//72

///\/\

//

解题思路是使用递归的方式把二叉树的左右节点进行互换;实现代码的时候可以把二叉树想成只有一个节点,即只包含一个左节点和一个右节点,然后把左节点与右节点进行互换;然后就可以想的更多一些,对二叉树的每一个节点都递归地把它的左节点和右节点进行互换。代码如下:

funcinvertTree(root*TreeNode)*TreeNode{

ifroot==nil{

returnnil

}

root.Left=invertTree(root.Left)

root.Right=invertTree(root.Right)

tempNode:=root.Left

root.Left=root.Right

root.Right=tempNode

returnroot

}

获取二叉树的最长路径长度

第二个算法题目是求二叉树的最长路径长度,题目如下:

//Givenabinarytree

//1

///\

//23

///\

//45

//Return3,whichisthelengthofthepath[4,2,1,3]or[5,2,1,3].

解题思路是使用递归的方式获取二叉树的每个节点的最大路径长度;实现代码的时候可以把每个节点都想成一个二叉树的根节点,这样问题就可以拆分成求二叉树的最大深度的问题,每个节点的左右最大深度的和就是经过该节点的最大路径长度。当经过该节点的最大路径长度,通过递归的方式获取节点自身,节点的左节点和节点的右节点的最大值就是问题的答案。代码如下:

funcdiameterOfBinaryTree(root*TreeNode)int{

i:=0

ifroot==nil{

returni

}

ifroot.Left==nilroot.Right==nil{

returni

}

i+=diameterOneBinaryTree(root.Left)

i+=diameterOneBinaryTree(root.Right)

l:=diameterOfBinaryTree(root.Left)

r:=diameterOfBinaryTree(root.Right)

iflilr{

returnl

}elseifrirl{

returnr

}else{

returni

}

}

//获取节点的最大深度

funcdiameterOneBinaryTree(root*TreeNode)int{

ifroot==nil{

return0

}

left:=diameterOneBinaryTree(root.Left)

right:=diameterOneBinaryTree(root.Right)

ifleftright{

returnleft+1

}else{

returnright+1

}

}

赞赏

长按







































治白癜风偏方
哪里治白癜风最专业



转载请注明:http://www.92nongye.com/hxjs/204618928.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了