free0day 2020-06-14
type node struct { data int lchild *node rchild *node } func newNode(data int) *node { return &node{data: data} } type binaryTree struct { root *node } func (o *binaryTree)append(data int) { tmp := newNode(data) if o.root == nil { o.root = tmp }else { queue := make([]*node,0) queue = append(queue,o.root) for len(queue) > 0 { cur := queue[0] if cur.lchild == nil { cur.lchild = tmp break } if cur.rchild == nil { cur.rchild = tmp break } queue = append(queue,cur.lchild) queue = append(queue,cur.rchild) queue = queue[1:] } } } // 前 中 后便利 func (o *binaryTree)preorder(root *node){ if root == nil{ return } fmt.Println(root.data) o.preorder(root.lchild) o.preorder(root.rchild) } func (o *binaryTree)inorder(root *node){ if root == nil{ return } o.preorder(root.lchild) fmt.Println(root.data) o.preorder(root.rchild) } func (o *binaryTree)postorder(root *node){ if root == nil{ return } o.preorder(root.lchild) o.preorder(root.rchild) fmt.Println(root.data) } // 深度遍历 func (o *binaryTree)BFS(root *node) { if root == nil{ return } queue := make([]*node,0) queue = append(queue,root) for len(queue) > 0{ cur := queue[0] fmt.Println(cur.data) queue = queue[1:] if cur.lchild != nil{ queue = append(queue, cur.lchild) } if cur.rchild != nil { queue = append(queue, cur.rchild) } } } // 二叉树节点个数 func (o *binaryTree)GetNodeNum(root *node) int{ if root == nil{ return 0 }else { return o.GetNodeNum(root.lchild) + o.GetNodeNum(root.rchild) +1 } } // 二叉树深度 func (o *binaryTree)GetDegree(root *node) int { if root == nil{ return 0 } var max int if o.GetDegree(root.lchild) > o.GetDegree(root.rchild){ max = o.GetDegree(root.lchild) }else { max = o.GetDegree(root.rchild) } return max + 1 } // k 层节点个数 func (o *binaryTree)GetKthNum(root *node,k int) int { if root == nil { return 0 } if k == 1{ return 1 } return o.GetKthNum(root.lchild,k-1) + o.GetKthNum(root.rchild,k-1) } // 叶子节点个数 func (o *binaryTree)GetLeavNum(root *node) int { if root == nil{ return 0 } if root.lchild == nil && root.rchild == nil{ return 1 } return o.GetLeavNum(root.lchild) + o.GetLeavNum(root.rchild) } // 判断平衡二叉树 func (o *binaryTree)isBalanced(root *node) bool{ if root == nil{ return true } lde := o.GetDegree(root.lchild) rde := o.GetDegree(root.rchild) flag := false if (math.Abs(float64(lde-rde)))<=1{ flag = true }else { flag = false } return flag && o.isBalanced(root.lchild) && o.isBalanced(root.rchild) }