亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 邏輯算法 > 正文

算法系列15天速成 第十二天 樹操作【中】

2024-09-08 23:18:41
字體:
供稿:網(wǎng)友

先前說了樹的基本操作,我們采用的是二叉鏈表來保存樹形結(jié)構(gòu),當(dāng)然二叉有二叉的困擾之處,比如我想找到當(dāng)前結(jié)點(diǎn)的“前驅(qū)”和“后繼”,那么我們就必須要遍歷一下樹,然后才能定位到該“節(jié)點(diǎn)”的“前驅(qū)”和“后繼”,每次定位都是O(n),這不是我們想看到的,那么有什么辦法來解決呢?

   (1) 在節(jié)點(diǎn)域中增加二個(gè)指針域,分別保存“前驅(qū)”和“后繼”,那么就是四叉鏈表了,哈哈,還是有點(diǎn)浪費(fèi)空間啊。

   (2) 看下面的這個(gè)二叉樹,我們知道每個(gè)結(jié)點(diǎn)有2個(gè)指針域,4個(gè)節(jié)點(diǎn)就有8個(gè)指針域,其實(shí)真正保存節(jié)點(diǎn)的指針

            僅有3個(gè),還有5個(gè)是空閑的,那么為什么我們不用那些空閑的指針域呢,達(dá)到資源的合理充分的利用。

一: 線索二叉樹

1  概念

      剛才所說的在空閑的指針域里面存放“前驅(qū)”和“后繼”就是所謂的線索。

        <1>  左線索:   在空閑的左指針域中存放該“結(jié)點(diǎn)”的“前驅(qū)”被認(rèn)為是左線索。

        <2>  右線索:   在空閑的右指針域中存放該“結(jié)點(diǎn)“的”后繼“被認(rèn)為是右線索。

      當(dāng)“二叉鏈表”被套上這種線索,就被認(rèn)為是線索鏈表,當(dāng)“二叉樹”被套上這種線索就被認(rèn)為是線索二叉樹,當(dāng)然線索根據(jù)

二叉樹的遍歷形式不同被分為“先序線索”,“中序線索”,“后序線索”。

2  結(jié)構(gòu)圖

      說了這么多,我們還是上圖說話,就拿下面的二叉樹,我們構(gòu)建一個(gè)中序線索二叉樹,需要多動(dòng)動(dòng)腦子喲。

     <1> 首先要找到“中序遍歷”中的首結(jié)點(diǎn)D,因?yàn)椤癉結(jié)點(diǎn)”是首節(jié)點(diǎn),所以不存在“前驅(qū)”,左指針自然是空,

            ”D節(jié)點(diǎn)”的右指針存放的是“后繼”,那么根據(jù)“中序遍歷”的規(guī)則應(yīng)該是B,所以D的右指針存放著B節(jié)點(diǎn)。

     <2>  接著就是“B節(jié)點(diǎn)”,他的左指針不為空,所以就不管了,但是他的“右指針”空閑,根據(jù)規(guī)則“B結(jié)點(diǎn)“的右

    指針存放的是"A結(jié)點(diǎn)“。

     <3>  然后就是“A節(jié)點(diǎn)”,他已經(jīng)被塞的滿滿的,所以就沒有“線索”可言了。

     <4>  最后就是“C節(jié)點(diǎn)”,根據(jù)規(guī)則,他的“左指針”存放著就是“A節(jié)點(diǎn)“,”C節(jié)點(diǎn)“是最后一個(gè)節(jié)點(diǎn),右指針自然就是空的,你懂的。

3 基本操作   

   常用的操作一般有“創(chuàng)建線索二叉樹”,”查找后繼節(jié)點(diǎn)“,”查找前驅(qū)節(jié)點(diǎn)“,”遍歷線索二叉樹“,下面的操作我們就以”中序遍歷“來創(chuàng)建中序線索二叉樹。

<1>  線索二叉樹結(jié)構(gòu)

          從“結(jié)構(gòu)圖”中可以看到,現(xiàn)在結(jié)點(diǎn)的指針域中要么是”子節(jié)點(diǎn)(SubTree)“或者是”線索(Thread)“,此時(shí)就要設(shè)立標(biāo)志位來表示指針域存放的是哪一種。

復(fù)制代碼 代碼如下:

#region 節(jié)點(diǎn)標(biāo)識(shí)(用于判斷孩子是節(jié)點(diǎn)還是線索)
    /// <summary>
/// 節(jié)點(diǎn)標(biāo)識(shí)(用于判斷孩子是節(jié)點(diǎn)還是線索)
/// </summary>
    public enum NodeFlag
    {
        SubTree = 1,
        Thread = 2
    }
    #endregion

    #region 線索二叉樹的結(jié)構(gòu)
    /// <summary>
/// 線索二叉樹的結(jié)構(gòu)
/// </summary>
/// <typeparam name="T"></typeparam>
    public class ThreadTree<T>
    {
        public T data;
        public ThreadTree<T> left;
        public ThreadTree<T> right;
        public NodeFlag leftFlag;
        public NodeFlag rightFlag;
    }
    #endregion

<2>  創(chuàng)建線索二叉樹

        剛才也說了如何構(gòu)建中序線索二叉樹,在代碼實(shí)現(xiàn)中,我們需要定義一個(gè)節(jié)點(diǎn)來保存當(dāng)前節(jié)點(diǎn)的前驅(qū),我練習(xí)的時(shí)候迫不得已,只能使用兩個(gè)

    ref來實(shí)現(xiàn)地址操作,達(dá)到一個(gè)Tree能夠讓兩個(gè)變量來操作。

復(fù)制代碼 代碼如下:

#region 中序遍歷構(gòu)建線索二叉樹
        /// <summary>
/// 中序遍歷構(gòu)建線索二叉樹
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
        public void BinTreeThreadingCreate_LDR<T>(ref ThreadTree<T> tree, ref ThreadTree<T> prevNode)
        {
            if (tree == null)
                return;

            //先左子樹遍歷,尋找起始點(diǎn)
            BinTreeThreadingCreate_LDR(ref tree.left, ref prevNode);

            //如果left為空,則說明該節(jié)點(diǎn)可以放“線索”
            tree.leftFlag = (tree.left == null) ? NodeFlag.Thread : NodeFlag.SubTree;

            //如果right為空,則說明該節(jié)點(diǎn)可以放“線索”
            tree.rightFlag = (tree.right == null) ? NodeFlag.Thread : NodeFlag.SubTree;

            if (prevNode != null)
            {
                if (tree.leftFlag == NodeFlag.Thread)
                    tree.left = prevNode;
                if (prevNode.rightFlag == NodeFlag.Thread)
                    prevNode.right = tree;
            }

            //保存前驅(qū)節(jié)點(diǎn)
            prevNode = tree;

            BinTreeThreadingCreate_LDR(ref tree.right, ref prevNode);
        }
        #endregion

<3> 查找后繼結(jié)點(diǎn)

         現(xiàn)在大家都知道,后繼結(jié)點(diǎn)都是保存在“結(jié)點(diǎn)“的右指針域中,那么就存在”兩種情況“。

            《1》 拿“B節(jié)點(diǎn)“來說,他沒有右孩子,則肯定存放著線索(Thread),所以我們直接O(1)的返回他的線索即可。

            《2》 拿“A節(jié)點(diǎn)”來說,他有右孩子,即右指針域存放的是SubTree,悲哀啊,如何才能得到“A節(jié)點(diǎn)“的后繼呢?其實(shí)也很簡(jiǎn)單,

根據(jù)”中序“的定義,”A節(jié)點(diǎn)“的后繼必定是”A節(jié)點(diǎn)“的右子樹往左鏈找的第一個(gè)沒有左孩子的節(jié)點(diǎn)(只可意會(huì),不可言傳,嘻嘻)。

復(fù)制代碼 代碼如下:

#region 查找指定節(jié)點(diǎn)的后繼
        /// <summary>
/// 查找指定節(jié)點(diǎn)的后繼
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
        public ThreadTree<T> BinTreeThreadNext_LDR<T>(ThreadTree<T> tree)
        {
            if (tree == null)
                return null;

            //如果查找節(jié)點(diǎn)的標(biāo)志域中是Thread,則直接獲取
            if (tree.rightFlag == NodeFlag.Thread)
                return tree.right;
            else
            {
                //根據(jù)中序遍歷的規(guī)則是尋找右子樹中中序遍歷的第一個(gè)節(jié)點(diǎn)
                var rightNode = tree.right;

                //如果該節(jié)點(diǎn)是subTree就需要循環(huán)遍歷
                while (rightNode.leftFlag == NodeFlag.SubTree)
                {
                    rightNode = rightNode.left;
                }
                return rightNode;
            }
        }
        #endregion

<4> 查找前驅(qū)節(jié)點(diǎn)
       

        這個(gè)跟(3)的操作很類似,同樣也具有兩個(gè)情況。

          《1》  拿“C結(jié)點(diǎn)”來說,他沒有“左子樹”,則說明“C節(jié)點(diǎn)”的左指針為Thread,此時(shí),我們只要返回左指針域即可得到前驅(qū)結(jié)點(diǎn)。

          《2》  拿"A節(jié)點(diǎn)“來說,他有”左子樹“,則說明”A節(jié)點(diǎn)“的左指針為SubTree,那么怎么找的到”A節(jié)點(diǎn)“的前驅(qū)呢?同樣啊,根據(jù)

                   ”中序遍歷“的性質(zhì),我們可以得知在”A節(jié)點(diǎn)“的左子樹中往”右鏈“中找到第一個(gè)沒有”右孩子“的節(jié)點(diǎn)。

復(fù)制代碼 代碼如下:

#region 查找指定節(jié)點(diǎn)的前驅(qū)
        /// <summary>
/// 查找指定節(jié)點(diǎn)的前驅(qū)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
/// <returns></returns>
        public ThreadTree<T> BinTreeThreadPrev_LDR<T>(ThreadTree<T> tree)
        {
            if (tree == null)
                return null;

            //如果標(biāo)志域中存放的是線索,那么可以直接找出來
            if (tree.leftFlag == NodeFlag.Thread)
                return tree.left;
            else
            {
                //根據(jù)”中序“的規(guī)則可知,如果不為Thread,則要找出左子樹的最后節(jié)點(diǎn)
//也就是左子樹中最后輸出的元素
                var leftNode = tree.left;

                while (leftNode.rightFlag == NodeFlag.SubTree)
                    leftNode = leftNode.right;

                return leftNode;
            }
        }
        #endregion

<5> 遍歷線索二叉樹

          因?yàn)槲覀儤?gòu)建線索的時(shí)候采用的是“中序”,那么我們遍歷同樣采用“中序”,大家是否看到了“線索”的好處,此時(shí)我們找某個(gè)節(jié)點(diǎn)的時(shí)間復(fù)雜度變?yōu)榱?/P>

        O(1) ~0(n)的時(shí)間段,比不是線索的時(shí)候查找“前驅(qū)"和“后繼”效率要高很多。

復(fù)制代碼 代碼如下:

#region 遍歷線索二叉樹
        /// <summary>
/// 遍歷線索二叉樹
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
        public void BinTreeThread_LDR<T>(ThreadTree<T> tree)
        {
            if (tree == null)
                return;

            while (tree.leftFlag == NodeFlag.SubTree)
                tree = tree.left;

            do
            {
                Console.Write(tree.data + "/t");

                tree = BinTreeThreadNext_LDR(tree);

            } while (tree != null);

        }
        #endregion

最后上一下總的運(yùn)行代碼

復(fù)制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ThreadChainTree
{
    class Program
    {
        static void Main(string[] args)
        {
            ThreadTreeManager manager = new ThreadTreeManager();

            //生成根節(jié)點(diǎn)
            ThreadTree<string> tree = CreateRoot();

            //生成節(jié)點(diǎn)
            AddNode(tree);

            ThreadTree<string> prevNode = null;

            //構(gòu)建線索二叉樹
            manager.BinTreeThreadingCreate_LDR(ref tree, ref prevNode);

            Console.WriteLine("/n線索二叉樹的遍歷結(jié)果為:/n");
            //中序遍歷線索二叉樹
            manager.BinTreeThread_LDR(tree);
        }

        #region 生成根節(jié)點(diǎn)
        /// <summary>
/// 生成根節(jié)點(diǎn)
/// </summary>
/// <returns></returns>
        static ThreadTree<string> CreateRoot()
        {
            ThreadTree<string> tree = new ThreadTree<string>();

            Console.WriteLine("請(qǐng)輸入根節(jié)點(diǎn),方便我們生成樹/n");

            tree.data = Console.ReadLine();

            Console.WriteLine("根節(jié)點(diǎn)生成已經(jīng)生成/n");

            return tree;
        }
        #endregion

        #region 插入節(jié)點(diǎn)操作
        /// <summary>
/// 插入節(jié)點(diǎn)操作
/// </summary>
/// <param name="tree"></param>
        static ThreadTree<string> AddNode(ThreadTree<string> tree)
        {
            ThreadTreeManager mananger = new ThreadTreeManager();

            while (true)
            {
                ThreadTree<string> node = new ThreadTree<string>();

                Console.WriteLine("請(qǐng)輸入要插入節(jié)點(diǎn)的數(shù)據(jù):/n");

                node.data = Console.ReadLine();

                Console.WriteLine("請(qǐng)輸入要查找的父節(jié)點(diǎn)數(shù)據(jù):/n");

                var parentData = Console.ReadLine();

                if (tree == null)
                {
                    Console.WriteLine("未找到您輸入的父節(jié)點(diǎn),請(qǐng)重新輸入。");
                    continue;
                }

                Console.WriteLine("請(qǐng)確定要插入到父節(jié)點(diǎn)的:1 左側(cè),2 右側(cè)");

                Direction direction = (Direction)Enum.Parse(typeof(Direction), Console.ReadLine());

                tree = mananger.BinTreeThreadAddNode(tree, node, parentData, direction);

                Console.WriteLine("插入成功,是否繼續(xù)?  1 繼續(xù), 2 退出");

                if (int.Parse(Console.ReadLine()) == 1)
                    continue;
                else
                    break;
            }

            return tree;
        }
        #endregion
    }

    #region 節(jié)點(diǎn)標(biāo)識(shí)(用于判斷孩子是節(jié)點(diǎn)還是線索)
    /// <summary>
/// 節(jié)點(diǎn)標(biāo)識(shí)(用于判斷孩子是節(jié)點(diǎn)還是線索)
/// </summary>
    public enum NodeFlag
    {
        SubTree = 1,
        Thread = 2
    }
    #endregion

    #region 線索二叉樹的結(jié)構(gòu)
    /// <summary>
/// 線索二叉樹的結(jié)構(gòu)
/// </summary>
/// <typeparam name="T"></typeparam>
    public class ThreadTree<T>
    {
        public T data;
        public ThreadTree<T> left;
        public ThreadTree<T> right;
        public NodeFlag leftFlag;
        public NodeFlag rightFlag;
    }
    #endregion

    #region 插入左節(jié)點(diǎn)或者右節(jié)點(diǎn)
    /// <summary>
/// 插入左節(jié)點(diǎn)或者右節(jié)點(diǎn)
/// </summary>
    public enum Direction { Left = 1, Right = 2 }
    #endregion

    #region 線索二叉樹的基本操作
    /// <summary>
/// 線索二叉樹的基本操作
/// </summary>
    public class ThreadTreeManager
    {
        #region 將指定節(jié)點(diǎn)插入到二叉樹中
        /// <summary>
/// 將指定節(jié)點(diǎn)插入到二叉樹中
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
/// <param name="node"></param>
/// <param name="direction">插入做左是右</param>
/// <returns></returns>
        public ThreadTree<T> BinTreeThreadAddNode<T>(ThreadTree<T> tree, ThreadTree<T> node, T data, Direction direction)
        {
            if (tree == null)
                return null;

            if (tree.data.Equals(data))
            {
                switch (direction)
                {
                    case Direction.Left:
                        if (tree.left != null)
                            throw new Exception("樹的左節(jié)點(diǎn)不為空,不能插入");
                        else
                            tree.left = node;

                        break;
                    case Direction.Right:
                        if (tree.right != null)
                            throw new Exception("樹的右節(jié)點(diǎn)不為空,不能插入");
                        else
                            tree.right = node;

                        break;
                }
            }

            BinTreeThreadAddNode(tree.left, node, data, direction);
            BinTreeThreadAddNode(tree.right, node, data, direction);

            return tree;
        }
        #endregion

        #region 中序遍歷構(gòu)建線索二叉樹
        /// <summary>
/// 中序遍歷構(gòu)建線索二叉樹
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
        public void BinTreeThreadingCreate_LDR<T>(ref ThreadTree<T> tree, ref ThreadTree<T> prevNode)
        {
            if (tree == null)
                return;

            //先左子樹遍歷,尋找起始點(diǎn)
            BinTreeThreadingCreate_LDR(ref tree.left, ref prevNode);

            //如果left為空,則說明該節(jié)點(diǎn)可以放“線索”
            tree.leftFlag = (tree.left == null) ? NodeFlag.Thread : NodeFlag.SubTree;

            //如果right為空,則說明該節(jié)點(diǎn)可以放“線索”
            tree.rightFlag = (tree.right == null) ? NodeFlag.Thread : NodeFlag.SubTree;

            if (prevNode != null)
            {
                if (tree.leftFlag == NodeFlag.Thread)
                    tree.left = prevNode;
                if (prevNode.rightFlag == NodeFlag.Thread)
                    prevNode.right = tree;
            }

            //保存前驅(qū)節(jié)點(diǎn)
            prevNode = tree;

            BinTreeThreadingCreate_LDR(ref tree.right, ref prevNode);
        }
        #endregion

        #region 查找指定節(jié)點(diǎn)的后繼
        /// <summary>
/// 查找指定節(jié)點(diǎn)的后繼
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
        public ThreadTree<T> BinTreeThreadNext_LDR<T>(ThreadTree<T> tree)
        {
            if (tree == null)
                return null;

            //如果查找節(jié)點(diǎn)的標(biāo)志域中是Thread,則直接獲取
            if (tree.rightFlag == NodeFlag.Thread)
                return tree.right;
            else
            {
                //根據(jù)中序遍歷的規(guī)則是尋找右子樹中中序遍歷的第一個(gè)節(jié)點(diǎn)
                var rightNode = tree.right;

                //如果該節(jié)點(diǎn)是subTree就需要循環(huán)遍歷
                while (rightNode.leftFlag == NodeFlag.SubTree)
                {
                    rightNode = rightNode.left;
                }
                return rightNode;
            }
        }
        #endregion

        #region 查找指定節(jié)點(diǎn)的前驅(qū)
        /// <summary>
/// 查找指定節(jié)點(diǎn)的前驅(qū)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
/// <returns></returns>
        public ThreadTree<T> BinTreeThreadPrev_LDR<T>(ThreadTree<T> tree)
        {
            if (tree == null)
                return null;

            //如果標(biāo)志域中存放的是線索,那么可以直接找出來
            if (tree.leftFlag == NodeFlag.Thread)
                return tree.left;
            else
            {
                //根據(jù)”中序“的規(guī)則可知,如果不為Thread,則要找出左子樹的最后節(jié)點(diǎn)
//也就是左子樹中最后輸出的元素
                var leftNode = tree.left;

                while (leftNode.rightFlag == NodeFlag.SubTree)
                    leftNode = leftNode.right;

                return leftNode;
            }
        }
        #endregion

        #region 遍歷線索二叉樹
        /// <summary>
/// 遍歷線索二叉樹
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tree"></param>
        public void BinTreeThread_LDR<T>(ThreadTree<T> tree)
        {
            if (tree == null)
                return;

            while (tree.leftFlag == NodeFlag.SubTree)
                tree = tree.left;

            do
            {
                Console.Write(tree.data + "/t");

                tree = BinTreeThreadNext_LDR(tree);

            } while (tree != null);

        }
        #endregion
    }
    #endregion
}

將文章開頭處的數(shù)據(jù)輸入到存儲(chǔ)結(jié)構(gòu)中

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
av免费网站在线| aaa大片在线观看| 免费在线看黄网站| 久久精品99国产精| 国产中文在线观看| 国产一区二区视频在线免费观看| 蜜桃视频m3u8在线观看| 999精品视频在这里| 中文字幕亚洲图片| 最新av免费看| 老司机午夜激情| 国产色爱av资源综合区| 久久久91视频| 一级精品视频在线观看宜春院| 欧美性猛交一区二区三区| 欧美日韩精品一区二区在线播放| 亚洲小说区图片| 最新黄色网址在线观看| 欧美影院午夜播放| 精品美女永久免费视频| 亚洲成人自拍网| 精品日本一区二区| 婷婷综合在线观看| √天堂中文在线| 91麻豆精品91久久久久久清纯| 亚洲三级视频网站| 国产青青视频| 水蜜桃在线视频| 亚洲精品国产精品乱码不卡| 国产99在线免费| 视频一区二区三区中文字幕| 波多野结衣久久高清免费| 国产欧美日韩精品一区| aaaa欧美| 日产欧产va高清| 国产成人综合亚洲网站| 国产激情一区二区三区四区| 欧美日韩国产中字| 2019亚洲男人天堂| 久青草国产在线| 特级西西人体www高清大胆| 亚洲av电影一区| 国产日韩亚洲欧美| 嫩草嫩草嫩草嫩草| 99久久精品国产亚洲精品| 亚洲久草在线| 亚洲欧美春色| 久久精品视频久久| 欧美日本中文| 粉嫩av一区二区| 99精品福利视频| 黄网站在线观看高清免费| 亚洲高清在线观看一区| 99久久综合狠狠综合久久aⅴ| 欧美日韩国产专区| 欧美电影一二区| 高潮按摩久久久久久av免费| 成人av免费| 免费一级在线观看| 韩国在线视频一区| 亚洲人成小说网站色在线| 欧美亚洲日本一区| 成人免费xxxxx在线视频| 亚洲色图校园春色| 成人在线视频中文字幕| 国产亚洲综合在线| 亚洲国产精品久久久| 亚洲va在线观看| 欧美黑人ⅹxxx另类猛交| 精品国内产的精品视频在线观看| 秋霞一区二区三区| 日韩一区欧美| 国产精彩视频一区二区| 男人影院在线观看| 亚洲欧美另类国产| 欧美男女爱爱视频| 欧美偷窥清纯综合图区| 国产精品久久久久久久天堂第1集| 在线视频你懂得| 91超薄丝袜肉丝一区二区| 狂野欧美激情性xxxx欧美| 日本在线观看高清完整版| 欧美午夜一区二区三区免费大片| 日韩欧美国产亚洲| 久久精品一区二区三| 国产女人在线观看| 精品一级视频| 黄色免费影视| 91麻豆产精品久久久久久| 岳乳丰满一区二区三区| 精品人在线二区三区| 免费观看特级毛片| 99久久国产综合精品女小说| 国产短剧电视剧免费观看| 91精品国产91久久久| 日本精品二区| 日韩毛片在线视频| 瑟瑟在线观看| 欧美日韩福利电影| 国产精品v欧美精品v日韩精品| 亚洲精品中文字幕乱码三区不卡| 免费成人小视频| a√资源在线| 亚洲淫成人影院| 欧美亚洲色综久久精品国产| 91视频在线免费| 欧美久久久久久久久久久久久| av在线影院| 成人午夜免费电影| 99精品视频在线看| 久久亚洲精品中文字幕冲田杏梨| 免费黄视频网站| 91精品国产91久久久久久| 青青热久免费精品视频在线18| 国产精品nxnn| 欧美综合激情网| 韩国黄色一级片| 国产精品久久久久久久久久辛辛| 中文字幕资源网在线观看| 99久久国产宗和精品1上映| 日本乱人伦a精品| 成人在线免费高清视频| 成人午夜在线播放| 久久99精品久久久久久园产越南| 色女孩综合网| 久久91亚洲精品中文字幕奶水| 国产伦视频一区二区三区| 欧美老女人bb| 国产精品国产三级国产aⅴ| 操人视频在线播放| 亚洲视频导航| 久久蜜桃av一区精品变态类天堂| 激情久久av| eeuss网址直达入口| 亚洲欧美一区二区三区久本道91| 欧美日一区二区在线观看| 麻豆网址在线观看| 国产一区一一区高清不卡| 亚洲国内精品视频| 午夜久久久久久噜噜噜噜| 99国产欧美另类久久久精品| 手机在线观看免费av| 五月天色综合| 亚洲国产精品网站| 欧美精品色综合| 草莓视频18免费观看| 欧美成人专区| 欧美精品亚洲精品日韩精品| 精品久久久无码人妻字幂| 亚洲欧美国产另类首页| 久久综合加勒比| 亚洲国产精品久久人人爱潘金莲| 色婷婷国产精品综合在线观看| 国产精品x8x8一区二区| 亚洲永久免费观看| 老司机精品视频导航| 91黄色在线观看| www.日本久久| 91黑丝在线| 蜜桃av噜噜一区二区三区小说| 亚洲天堂电影| 欧美视频一区二区三区| 久久精品国产久精国产爱| 欧美网色网址| 美日韩一二三区| 国产网站免费在线观看| 亚洲精品动漫100p| 国产精品综合久久久久久| 91视频亚洲| а√天堂8资源中文在线| 在线视频影院| 日本免费一二区| 日韩免费福利视频| 亚洲一区二区免费视频软件合集| 91久久夜色精品国产按摩| 二区三区在线播放| 国产亚洲综合性久久久影院| 日韩三级高清在线| 国产欧美精品在线| 欧美a级片一区| 欧美舌奴丨vk视频| 在线视频免费观看一区| 久久久久无码精品| caoporn-草棚在线视频最| 国产精品久久久久久久av大片| 制服丝袜在线第一页| 18视频在线观看娇喘| 欧美日韩在线观看视频小说| 又黄又爽在线观看| 亚洲天堂成人在线| 免费国产在线精品一区二区三区| 五月婷婷六月色| 成人涩涩小片视频日本| 亚洲精品一二三四五区| 麻豆一区二区三区视频| 国产成人精品一区二区免费视频| 黄色片一区二区三区| 一本久久综合亚洲鲁鲁五月天| 日本japanese极品少妇| 亚洲婷婷综合久久一本伊一区| 色se01短视频永久免费| 波多野结衣办公室双飞| 永久av免费在线观看| 亚洲毛片免费看| 五月天亚洲精品| 日韩中文字幕a| 美女被到爽高潮视频| 国产精品久线在线观看| 成人性生交大片免费看小说| 草久久免费视频| 黄网免费入口| 亚洲一区日韩| 亚洲午夜精品在线观看| 国产美女在线观看一区| 精品综合久久久久久8888| 视色,视色影院,视色影库,视色网| 色老板在线视频| 久久99国产精一区二区三区| 国产成人精品免费看视频| 最新中文字幕一区二区三区| 欧美一区二区三区婷婷| 成人不卡免费av| 亚洲中字在线| 久久男人中文字幕资源站| 亚洲欧美日韩久久精品| 三年中国国语在线播放免费| 亚欧美中日韩视频| 亚洲成年人视频| xfplay资源站夜色先锋5566| 成人在线小视频| 在线视频一区二区三区在线播放| 九九热精品在线观看| 国内精品久久久久国产| 国产精品成久久久久| 最新精品国偷自产在线| 91午夜在线| 亚洲专区国产精品| 一本大道香蕉久久| 欧美顶级毛片在线播放| 中文字幕乱码人妻无码久久| 欧美一区二区久久| www国产黄色| 特级西西444www大胆免费看| 91老司机福利 在线| 日本中文字幕在线视频| av在线播放亚洲| 欧美性少妇18aaaa视频| 中文字幕亚洲精品在线观看| 一级做a爰片久久毛片16| 91偷拍一区二区三区精品| 精品无码国模私拍视频| 福利一区二区| 黄色免费直接看| 日日骚一区二区三区| 亚洲高清电影| 欧美日韩视频在线第一区| 视频二区欧美毛片免费观看| av中文字幕免费观看| 久久99精品国产麻豆不卡| 日韩在线伦理| 亚洲第九十九页| 国产网友自拍视频导航网站在线观看| 97影院在线午夜| 成年人一级黄色片| 国产真实有声精品录音| 久久久噜噜噜久久人人看| 亚洲日本japanese丝袜| 综合图区亚洲| 亚洲AV无码成人精品区明星换面| 亚洲成人av电影| 日韩美女视频免费看| 国产69精品99久久久久久宅男| 爱福利视频一区| 蜜臀av粉嫩av懂色av| 国产成人h网站| 在线观看完整版免费| 国产精品伦子伦| 国产一区玩具在线观看| 国产在线xxxx| 欧美激情日韩| 亚洲精品a级片| 九九热视频精品在线观看| 日韩一区欧美小说| 色婷婷激情综合| 永久免费观看片现看| 国产精品视频免费观看| 领导边摸边吃奶边做爽在线观看| 亚洲午夜无码av毛片久久| 婷婷精品在线| 狠狠躁夜夜躁av无码中文幕| 欧美激情视频一区| 99精品视频中文字幕| 91精品国产aⅴ一区二区| 国产精品高清一区二区三区| 亚洲精品蜜桃乱晃| 成人3d漫画免费无遮挡软件| 不卡的av网站| 久久精品国产亚洲AV熟女| 色哺乳xxxxhd奶水米仓惠香| 国产亚洲精品久久久久久打不开| 国外成人免费视频| 久久一区二区三区国产精品| 中文字幕一区二区三区四区免费看| 成人动漫视频在线观看完整版| 欧美日韩视频免费观看| 欧美三区免费完整视频在线观看| 一区二区三区在线视频观看58| 亚洲a成v人在线观看| 色婷婷精品久久二区二区蜜臂av| 在线观看日韩中文字幕| 成年男女免费视频网站不卡| 视频三区在线观看| 国产91色在线|亚洲| 国产成人久久精品77777最新版本| 成人性生交大片免费看小说| 午夜精品一区二区三区国产| 91网站在线观看免费| 成人在线超碰| 亚洲国产sm捆绑调教视频| 99在线精品视频在线观看| 国产无套精品一区二区| 小说区图片区综合久久亚洲| 国产极品美女高潮无套嗷嗷叫酒店| 高清在线观看日韩| 91中文字幕在线| 亚洲国产另类久久精品| 毛片基地在线观看| 91成人噜噜噜在线播放|