leetcode-二叉树

栏目: 数据库 · 发布时间: 6年前

package main

import (
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

type stack struct {
	BinTree []*TreeNode
	Top     int
}

func (nodeStack *stack) push(node *TreeNode) {
	nodeStack.BinTree = append(nodeStack.BinTree, node)
	nodeStack.Top++
}

func (nodeStack *stack) pop() *TreeNode {
	var res *TreeNode
	nodeStack.Top--
	if nodeStack.Top < 0 {
		res = nil
	} else {
		res = nodeStack.BinTree[nodeStack.Top]
	}
	nodeStack.BinTree = nodeStack.BinTree[:nodeStack.Top]
	return res
}

func inorderTraversal1(root *TreeNode) []int {
	res := []int{}
	myStack := &stack{[]*TreeNode{}, 0}
	for nil != root || myStack.Top != 0 {
		for nil != root {
			myStack.push(root)
			root = root.Left
		}
		root = myStack.pop()
		res = append(res, root.Val)
		root = root.Right
	}
	return res
}

func inorderTraversal(root *TreeNode) []int {
	res := []int{}
	myStack := &stack{[]*TreeNode{}, 0}
	for nil != root || myStack.Top != 0 {
		for nil != root {
			myStack.push(root)
			root = root.Left
		}
		root = myStack.pop()
		res = append(res, root.Val)
		root = root.Right
	}
	return res
}

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func buildTree(inorder []int, postorder []int) *TreeNode {
	lens = len(inorder)
	mid := 0
	for i := 0; i < lens; i++ {
		if inorder[i] == postorder[lens-1] {
			mid = i
		}
	}
	return &TreeNode{inorder[mid].Val, buildTree(inorder[:mid], postorder[:mid]), buildTree(inorder[mid+1:lens], postorder[mid:lens-1])}
}

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSymmetric(root *TreeNode) bool {
	if nil == root {
		return true
	}
	return isSym(root.Left, root.Right)
}

func isSym(left, right *TreeNode) bool {
	if nil == left && nil == right {
		return true
	}
	if nil == left || nil == right || left.Val != right.Val {
		return false
	}
	outerRes := isSym(left.Left, right.Right)
	innerRes := isSym(left.right, right.Left)
	return outerRes && innerRes
}

func isSymmetric1(root *TreeNode) bool {
	s := *stack{0, nil, nil}
	if root == nil {
		return true
	}
	stack.push(root.Left)
	stack.push(root.Right)
	for s.Top > 0 {
		left := s.pop()
		right := s.pop()
		if left == nil && right == nil {
			continue
		}
		if left == nil || right == nil || left.Val == right.Val {
			return false
		}
		s.push(left.Left)
		s.push(right.Right)
		s.push(left.Right)
		s.push(right.Left)
	}
	return true
}

func maxDepth(root *TreeNode) int {
	if nil == root {
		return 0
	}
	leftD := maxDepth(root.Left)
	rightD := maxDepth(root.Right)
	if leftD > rightD {
		return leftD + 1
	} else {
		return rightD + 1
	}
}

func maxDepth1(root *TreeNode) int {
	deps := 0
	que := []*TreeNode{root}
	lens := len(que)
	for lens > 0 {
		for i := 0; i < lens; i++ {
			if nil == que[i] {
				continue
			}
			que = append(que, que[i].Left)
			que = append(que, que[i].Right)
		}
		que = que[lens:]
		lens = lens(que)
		if lens > 0 {
			deps++
		}
	}
	return deps
}

func levelOrderBottom(root *TreeNode) [][]int {
	res := [][]int{}
	if nil == root {
		return res
	}
	que := []*TreeNode{root}
	lens := len(que)
	for lens > 0 {
		level := []int{}
		for i := 0; i < lens; i++ {
			level = append(level, que[i].Val)
			if nil != que[i].Left {
				que = append(que, que[i].Left)
			}
			if nil != que[i].Right {
				que = append(que, que[i].Right)
			}
		}
		que = que[lens:]
		lens = len(que)
		res = append([][]int{level}, res)
	}
	return res
}

func levelOrderBottom1(root *TreeNode) [][]int {
	res := [][]int{}
	res = levelOrder(0, root, res)
}

func levelOrder(level int, root *TreeNode, res [][]int) [][]int {
	if nil == root {
		return res
	}
	if _, exist := res[level]; !exist {
		res = append(res, []int)
	}
	res[level] = append(res[level], root.Val)
	res = levelOrder(level+1, root.Left, res)
	return levelOrder(level+1, root.Right, res)
}

func minDepth(root *TreeNode) int {
	if nil == root {
		return 0
	}
	left := minDepth(root.Left)
	right := minDepth(root.Right)
	if left == 0 {
		return right + 1
	} else if right == 0 {
		return left + 1
	} else {
		if left > right {
			return right + 1
		} else {
			return left + 1
		}
	}
}

func isBalanced(root *TreeNode) bool {
	res := false
	dep := isBlan(root)
	if dep > 0 {
		res = true
	}
	return res
}

func isBlan(root *TreeNode) int {
	if nil == root {
		return 0
	}
	left := isBlan(root.Left)
	right := isBlan(root.Right)
	if left < 0 || right < 0 {
		return -1
	}
	diff := left - right
	if diff < -1 || diff > 1 {
		return -1
	} else if diff >= 0 {
		return left + 1
	} else {
		return right + 1
	}
}

func zigzagLevelOrder(root *TreeNode) [][]int {
	res := [][]int{}
	return recursive(0, root, res)
}

func recursive(dep int, root *TreeNode, res [][]int) [][]int {
	if nil == root {
		return res
	}
	if dep+1 > lens(res) {
		res = append(res, []int)
	}
	if dep/2 == 0 {
		res[dep] = append(res[dep], root.Val)
	} else {
		res[dep] = append([]int{root.Val}, res[dep]...)
	}
	res := recursive(dep+1, root.Left, res)
	return recursive(dep+1, root.Right, res)
}

func zigzagLevelOrder1(root *TreeNode) [][]int {
	res := [][]int{}
	que := []*TreeNode{root}
	lens := len(que)
	dep := 0
	for lens > 0 {
		level := []int{}
		for i := 0; i < lens; i++ {
			if nil == que[i] {
				continue
			}
			if dep%2 == 0 {
				level = append(level, que[i].Val)
			} else {
				level = append([]int{que[i].Val}, level...)
			}
			que = append(que, que[i].Left)
			que = append(que, que[i].Right)
		}
		res = append(res, level)
		que = que[lens:]
		lens = len(que)
		dep++
	}
}

func buildTree(preorder []int, inorder []int) *TreeNode {
	if len(preorder) == 0 {
		return nil
	}
	head := preorder[0]
	index := 0
	for i := 0; i < len(inorder); i++ {
		if inorder[i] == head {
			index = i
		}
	}
	return &TreeNode{root.Val, buildTree(preorder[1:index+1], inorder[:index]), buildTree(preorder[index+1:], inorder[index+1:])}
}

func hasPathSum(root *TreeNode, sum int) bool {
	if root == nil {
		return false
	}
	if root.Left == nil && root.Right == nil {
		return root.Val == sum
	}
	sum -= sum - root.Val
	if root.Left != nil {
		leftRes := hasPathSum(root.Left, sum)
	}
	if root.Left != nil {
		rightRes := hasPathSum(root.Right, sum)
	}
	return leftRes && rightRes
}

func insertionSortList(head *ListNode) *ListNode {
	myHead := &ListNode{0, nil}
	for head != nil {
		node := head
		for nowHead := myHead; nowHead.Next != nil; nowHead = nowHead.Next {
			if nowHead.Next.Val > node.Val {
				node.Next = nowHead.Next
				nowHead.Next = node
				break
			}
		}
	}
	return myHead
}

func rightSideView(root *TreeNode) []int {
	que := []*TreeNode{root}
	lens := 1
	res := []int{}
	for lens > 0 {
		level := []int{}
		for i := 0; i < lens; i++ {
			if que[i] == nil {
				continue
			}
			level = append(level, que[i].Val)
			que = append(que, que[i].Left)
			que = append(que, que[i].Right)
		}
		res = append(res, level[lens-1])
		que = que[:lens]
		lens = len(que)
	}
	return res
}

func rangeSumBST(root *TreeNode, L int, R int) int {
	sum := 0
	if nil == root {
		return 0
	}
	if root.Val >= L {
		sum += rangeSumBST(root.Left, L, R)
	}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你也能看得懂的Python算法书

你也能看得懂的Python算法书

王硕,董文馨,张舒行,张洁 著 / 电子工业出版社 / 2018-11-1 / 59.00

编程的核心是算法,学习算法不仅能教会你解决问题的方法,而且还能为你今后的发展提供一种可能。 《你也能看得懂的Python算法书》面向算法初学者,首先介绍当下流程的编程语言Python,详细讲解Python语言中的变量和循序、分支、循环三大结构,以及列表和函数的使用,为之后学习算法打好基础。然后以通俗易懂的语言讲解双指针、哈希、深度优先、广度优先、回溯、贪心、动态规划和至短路径等经典算法。 ......一起来看看 《你也能看得懂的Python算法书》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

html转js在线工具
html转js在线工具

html转js在线工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具