亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

巡回練習:等效二叉樹

巡回練習:等效二叉樹

Go
MMTTMM 2021-05-14 10:17:17
我正在嘗試解決等效的二叉樹演習練習。這是我所做的;package mainimport "tour/tree"import "fmt"// Walk walks the tree t sending all values// from the tree to the channel ch.func Walk(t *tree.Tree, ch chan int) {    if t.Left != nil {        Walk(t.Left, ch)    }    ch <- t.Value    if t.Right != nil {        Walk(t.Right, ch)    }}// Same determines whether the trees// t1 and t2 contain the same values.func Same(t1, t2 *tree.Tree) bool {    ch1 := make(chan int)    ch2 := make(chan int)    go Walk(t1, ch1)    go Walk(t2, ch2)    for k := range ch1 {        select {        case g := <-ch2:            if k != g {                return false            }        default:            break        }    }    return true}func main() {    fmt.Println(Same(tree.New(1), tree.New(1)))    fmt.Println(Same(tree.New(1), tree.New(2)))}但是,我無法找出如何發信號通知樹中是否還剩下任何元素。我不能使用close(ch)on,Walk()因為它會使通道在所有值發送之前關閉(因為遞歸。)有人可以在這里幫我嗎?
查看完整描述

3 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

如果Walk函數本身不遞歸,則可以使用close()。即步行將做:


func Walk(t *tree.Tree, ch chan int) {

    walkRecurse(t, ch)

    close(ch)

}

其中walkRecurse或多或少是您當前的Walk功能,但是在walkRecurse上遞歸。(或者您將Walk重寫為迭代式的-理所當然,這更加令人生厭)使用這種方法,您的Same()函數必須了解Channels已關閉,這是通過表單的channel接收完成的


k, ok1 := <-ch

g, ok2 := <-ch

當ok1和ok2彼此不同時,或者當兩者都不同時,采取適當的措施false


另一種方法(但可能不是本練習的精神)是計算樹中的節點數:


func Same(t1, t2 *tree.Tree) bool {

    countT1 := countTreeNodes(t1)

    countT2 := countTreeNodes(t2)

    if countT1 != countT2 {

        return false

    }

    ch1 := make(chan int)

    ch2 := make(chan int)

    go Walk(t1, ch1)

    go Walk(t2, ch2)

    for i := 0; i < countT1; i++ {

        if <-ch1 != <-ch2 {

            return false

        }

    }

    return true

}

您必須實現countTreeNodes()函數,該函數應該計算* Tree中的節點數


查看完整回答
反對 回復 2021-05-17
  • 3 回答
  • 0 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號